2023/5/24 下午5:38:27 请通过Python写出重复元素判定。编写一个函数,接受列表作为参数,如果一个元素在列表中出现了不止一次,则返回 True,但不要改变原来列表的值。同时编写调用这个函数和测试结果的程序。
时间: 2024-01-21 12:19:21 浏览: 106
可以使用Python内置的set()函数来判断列表中是否存在重复元素,因为set()函数会将列表中的元素去重,如果去重后的长度与原列表长度不相等,则说明存在重复元素。
以下是代码实现:
```python
def has_duplicate(lst):
return len(lst) != len(set(lst))
# 测试代码
lst1 = [1, 2, 3, 4, 5]
lst2 = [1, 2, 3, 3, 4]
lst3 = ['a', 'b', 'c', 'c', 'd']
print(has_duplicate(lst1)) # False
print(has_duplicate(lst2)) # True
print(has_duplicate(lst3)) # True
# 原始列表不变
print(lst1) # [1, 2, 3, 4, 5]
print(lst2) # [1, 2, 3, 3, 4]
print(lst3) # ['a', 'b', 'c', 'c', 'd']
```
输出结果为:
```
False
True
True
[1, 2, 3, 4, 5]
[1, 2, 3, 3, 4]
['a', 'b', 'c', 'c', 'd']
```
可以看到,函数成功判断出了列表中是否存在重复元素,并且原始列表的值没有发生改变。
相关问题
重复元素判定。 编写一个函数,接受列表作为参数。如果该列表中存在一个元素在列表中出现不止一次的情况,则函数返回True,否则返回False。同时编写程序调用该函数和测试结果的程序。即函数仅需要判断出列表中是否有重复元素,不需要把哪个/哪些元素重复了作为函数的返回结果。 利用集合的无重复性再写一个版本完成程序的功能。 注:为了方便程序运行和评分,要求程序接受英文逗号分隔的输入,如输入“1,2,1”时,输出“有重复元素”,输入“2,3"时,输出“无重复元素”。
以下是第一个版本的代码,利用了列表的count方法:
```python
def has_duplicate(lst):
for item in lst:
if lst.count(item) > 1:
return True
return False
input_str = input("请输入一个列表,元素用英文逗号分隔:")
lst = input_str.split(",")
if has_duplicate(lst):
print("有重复元素")
else:
print("无重复元素")
```
以下是第二个版本的代码,利用了集合的无重复性:
```python
def has_duplicate(lst):
return len(lst) != len(set(lst))
input_str = input("请输入一个列表,元素用英文逗号分隔:")
lst = input_str.split(",")
if has_duplicate(lst):
print("有重复元素")
else:
print("无重复元素")
```
用python写一个递归下降的语法分析器,要求如下:(1)写出Sample语言(或你所选定的语言)的算术表达式的文法,利用递归下降的方法编写判定给定的单词串能否构成一个正确的算术表达式的函数,写一个主函数读入一个单词串,进行测试。(2)利用上一步的方法,编写对赋值表达式、布尔表达式和关系表达式的分析。(3)编写对if语句语法结构的分析。(4)编写对程序的语法结构的分析,完成一个完整的Sample语言程序的分析。
Sample语言的算术表达式文法:
<expression> → <term> | <expression> + <term> | <expression> - <term>
<term> → <factor> | <term> * <factor> | <term> / <factor>
<factor> → <number> | (<expression>)
<number>表示一个数字,可以是整数或小数。
实现代码如下:
def expression(tokens):
if len(tokens) == 0:
return False
if term(tokens):
if len(tokens) == 0:
return True
if tokens[0] == '+' or tokens[0] == '-':
return expression(tokens[1:])
else:
return False
else:
return False
def term(tokens):
if len(tokens) == 0:
return False
if factor(tokens):
if len(tokens) == 0:
return True
if tokens[0] == '*' or tokens[0] == '/':
return term(tokens[1:])
else:
return False
else:
return False
def factor(tokens):
if len(tokens) == 0:
return False
if tokens[0] == '(':
if expression(tokens[1:]):
if len(tokens) > 1 and tokens[1] == ')':
return True
else:
return False
else:
return False
else:
return number(tokens)
def number(tokens):
if len(tokens) == 0:
return False
if tokens[0].isdigit():
if len(tokens) == 1:
return True
if tokens[1].isdigit() or tokens[1] == '.':
return number(tokens[1:])
else:
return True
elif tokens[0] == '-':
return number(tokens[1:])
else:
return False
主函数可以这样实现:
def test_expression():
while True:
s = input('Input an expression (press q to quit): ')
if s == 'q':
break
tokens = s.split()
if expression(tokens):
print('Valid expression')
else:
print('Invalid expression')
if __name__ == '__main__':
test_expression()
对于赋值表达式、布尔表达式和关系表达式的分析,可以类似地实现递归下降的函数。例如,布尔表达式的文法:
<boolean> → <boolean> or <boolean> | <boolean> and <boolean> | not <boolean> | <relation>
<relation> → <expression> < <expression> | <expression> <= <expression> | <expression> == <expression> | <expression> >= <expression> | <expression> > <expression> | <expression> != <expression>
实现代码如下:
def boolean(tokens):
if len(tokens) == 0:
return False
if tokens[0] == 'not':
return boolean(tokens[1:])
if relation(tokens):
return True
if len(tokens) > 2 and (tokens[1] == 'and' or tokens[1] == 'or'):
if boolean(tokens[:2]) and boolean(tokens[2:]):
return True
else:
return False
else:
return False
def relation(tokens):
if len(tokens) == 0:
return False
if expression(tokens):
if len(tokens) > 1 and tokens[1] in ['<', '<=', '==', '>=', '>', '!=']:
if expression(tokens[2:]):
return True
else:
return False
else:
return True
else:
return False
赋值表达式和if语句的文法可以类似地定义和实现。对于程序的语法结构的分析,可以先实现对函数定义和函数调用的分析,然后再实现对程序的顶层结构的分析。具体实现略。
阅读全文