我试图获取两个具有不同长度的列表,并尝试使用列表理解来生成第三个包含相同数字的列表。我想避免重复。
我试图将列表理解与if测试结合使用,如代码所示。我也尝试使用and语句,但这不起作用。
input_shape
这是我目前拥有的解决方案,'我还试图将c列表理解更改为:
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
c = [x for x in a if x in b]
但是这没有用。使用列表推导不可能吗?我知道我可以很容易地使用集合来做到这一点。我只是在练习使用列表理解。
答案 0 :(得分:1)
根据使用c列表的原因,您可以考虑使用内置的set
结构进行交点操作,这样可以保证元素的唯一性。例如,set(a)
将产生一个包含a
中唯一元素的集合。
c = [x for x in a if x in b]
不起作用,因为a
中的重复元素仍包含在b
中,因此if语句不排除它们。 (1
在a
中重复,但是两个元素都将按照您的第一个定义包含在c
中,因为1
在b
中)。
编辑:如果您只想修改列表理解但继续使用它,则可以执行以下操作:c = [x for x in set(a) if x in b]
答案 1 :(得分:1)
如果您想要一个包含在两个原始列表中的任何一个中的所有元素的新列表,则可以使用set
类来实现。也许像这样:
>>> a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
>>> list(sorted(set(a) | set(b)))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 21, 34, 55, 89]
这是从列表中构建2个集合,然后找到所有元素的union,然后将结果转换回列表。
这种方法比检查大型列表的elem for elem in a if elem in b
更快,因为对于集合来说,成员资格测试是O(1)
,对于列表来说,则高达O(n)
。
答案 2 :(得分:0)
我将提出一个略有不同的解决方案:这个想法是先使用Counter
计算数字的频率,然后使用键执行列表理解。由于Counter
返回字典,因此您将没有重复的键。
from collections import Counter
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
f1 = Counter(a)
f2 = Counter(b)
c = [x for x in f1.keys() if x in f2.keys()]
# [1, 2, 3, 5, 8, 13]