我正在尝试编写一个程序,该程序使用随机生成的整数获取两个列表,并使用列表推导返回一个列表,其中包含两个列表中没有任何重复的数字。
importrandom
def estaDentroDe(a, listita):
for i in listita:
if (i == a):
return True
#
a = [random.randint(1,20) for i in range(20)]
b = [random.randint(1,20) for i in range(20)]
lista = []
lista = [elem_a for elem_a in a for elem_b in b if (elem_a == elem_b) if (not estaDentroDe(elem_a, lista))]
print (a)
print (b)
print (lista)
问题在于,不重复结果的部分效果不佳,它会过滤一些值但没有逻辑意义。
但是如果我不使用列表推导,只使用嵌套for和if(直接从上面的代码翻译)它可以正常工作
lista = []
for elem_a in a:
for elem_b in b:
if (elem_a == elem_b):
if (not estaDentroDe(elem_a, lista)):
lista.append(elem_a)
#
很清楚列表理解语法有问题,但我不明白...
修改
问题不是语法而是运行时。由于在列表推导中评估此子句时“lista”为空,因此“if”始终为true且不会过滤重复项。 相反,'for'版本在每次迭代中重新评估'lista',因此它不是空的(并且它可以工作)
我试图仅使用列表推导来实现它,因为我已被告知,但我不知道集合,它确实简化了这段代码。 我找到了一个解决方案来解决它与列表理解与副作用,但它并没有说服我。
我做了三种不同的方法。第二个很可爱,谢谢大家!
from random import randint
a = [randint(1,20) for i in range(20)]
b = [randint(1,20) for i in range(20)]
lista = set([elem_a for elem_a in a if elem_a in b]) #LIST COMPREHENSION & SETS
listab = set(a) & set(b) #ONLY SETS
listac_dup = [elem_a for elem_a in a if elem_a in b] #LIST COMPREHENSION & FOR/IF
listac = []
for elem in listac_dup:
if elem not in listac:
listac.append(elem)
print (a)
print (b)
print (lista)
print (listab)
print (listac)
答案 0 :(得分:1)
理解中的第二个if
应该是and
。除此之外,它看起来是正确的。
然而,这对于列表理解来说有点过于复杂。在我看来,代码的for循环版本更好。
答案 1 :(得分:1)
试试这个
import random
a = [random.randint(1,20) for i in range(20)]
b = [random.randint(1,20) for i in range(20)]
lista = [elem_a for elem_a in a if elem_a in b ]
print (lista)
答案 2 :(得分:0)
导入随机
Z = set(random.randrange(0,20)for I in range(0,20))
L =设定(范围(0,20)中I的random.randrange(0,20))
new = []
我在Z:
if I in L:
new.append(I)
打印(新)
这可以解决问题吗?
答案 3 :(得分:0)
Pythonic的方法是:
c= [ x for x in set(a) if x in set(b)]
# or c = set(a) & set (b) when you'll be at ease with sets.
管理多个元素。
列表理解,你必须计算......
丑陋的可能性:
[x for x in [y for (i,y) in enumerate(a) if y not in a[(i+1):]] if x in b]