您可以在列表理解条件语句中使用AND吗?

时间:2018-07-03 09:50:53

标签: python python-3.x list list-comprehension

我正在尝试使用列表理解来执行以下操作。我想创建一个新列表(唯一),该列表只有两个列表中的通用数字。

unique = []
for listcomp in range(len(list1)):
    if list1[listcomp] in list2 and list1[listcomp] not in unique:
        unique.append(list1[listcomp])
    else:
        continue

上面的方法工作正常,但是当我在下面创建列表理解时,如果list1具有重复的数字,则会得到重复。即list1 = [1,1,2],list2 = [1,5]。我创建的列表理解为

unique = [list1[listcomp] for listcomp in range(len(list1)) if list1[listcomp] in list2 and list1[listcomp] not in unique]

如果我得到重复的东西,我认为“ and”语句没有被应用?我已经阅读了有关将if语句进一步移动到comprehension语句的其他查询,但这没有用。您可以使用AND来扩展您的条件吗?

非常感谢

我的完整代码是:-

import random as rnd
# Randomly generate the size of your list
list1size = rnd.randint(1,20)
list2size = rnd.randint(1,20)
# Declare your list variables
list1 = []
list2 = []
# Fill your lists with randomly generated numbers upto the listsize generated above
for x in range(list1size):
    list1.append(rnd.randint(1,15))
for y in range(list2size):
    list2.append(rnd.randint(1,15))
# Not required but easier to read lists once sorted
list1.sort()
list2.sort()
print(list1)
print(list2)
# Now to compare old school

unique = []
# for listcomp in range(len(list1)):
#     if list1[listcomp] in list2 and list1[listcomp] not in unique:
#         unique.append(list1[listcomp])
#     else:
#         continue

# Now to compare with list comprehension
unique = [list1[listcomp] for listcomp in range(len(list1)) if list1[listcomp] in list2 and list1[listcomp] not in unique]
# Above doesn't stop duplicates if they are in List1 so I assume you can't use AND        

print(f"The common numbers in both lists are {unique}")

1 个答案:

答案 0 :(得分:2)

在进行过程中,您无法访问列表推导产生的元素。您的条件list1[listcomp] not in unique将始终返回True,因为此时unique被定义为unique = []中初始化的空列表。

因此,将应用and语句,而不是您想要的方式。

相反,您可以创建一个“可见的” set,其中包含已经找到的项目,并忽略它们。在itertools unique_everseen recipe中可以找到标准实现。

如果您拥有第三方toolz库,则可以使用相同的toolz.unique并提供生成器表达式。更像Pythonic,您可以直接迭代元素,而不是使用索引:

from toolz import unique

unique = list(unique(i for i in list1 if i in list2))