【问题标题】:Can you use AND in List comprehension conditional statements?您可以在列表理解条件语句中使用 AND 吗?
【发布时间】:2018-07-03 09:50:52
【问题描述】:

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

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 语句进一步移动到理解语句的其他查询,但这没有用。你可以使用 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}")

【问题讨论】:

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


    【解决方案1】:

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

    所以and 语句正在被应用,但不是你想要的方式。

    相反,您可以创建一个“已看到”set 来保存您已经找到的项目并忽略它们。标准实现见itertoolsunique_everseen recipe

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

    from toolz import unique
    
    unique = list(unique(i for i in list1 if i in list2))
    

    【讨论】:

    • 非常感谢,我想这是一行代码的缺点:-) 我设法让它与 set "unique = [a for a in set(list1) if a in list2] 一起工作"
    • @Chunkylump,只是一个小问题,您的代码的唯一问题是无法保证排序,set 是无序的,您获得的任何您期望的排序都应视为巧合。跨度>
    • @Chunkylump,我注意到你没有被接受。此解决方案不再适合您吗?
    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多