Python中的列表理解(比较而不是重复列表中的数字)

时间:2017-02-24 17:40:18

标签: python list list-comprehension

我正在尝试编写一个程序,该程序使用随机生成的整数获取两个列表,并使用列表推导返回一个列表,其中包含两个列表中没有任何重复的数字。

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)

4 个答案:

答案 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]