我在python中有19个大的数字列表,并希望从所有这些列表中创建一个新的列表。所以最后我会有一个清单。 我为两个列表制作了以下代码,并且完美运行:
a2 = [x for x in l2 if x+3 in l1]
这段代码只有当它们之间的差异为3时,才会查找两个列表中的元素。这意味着如果l2中有一个元素比l1中的元素大3个单元并且新列表,它会在l1中找到任何元素会有提到的元素l1
例如l1 = [1,2,3,6,5,7,8,9]
和l2 = [4, 6,10,11,13,14]
new = [1,3,7,8]
但我不知道如何包含剩余的列表。因此,它不是在l2
中查找元素,而是查找比l1
"更多元素的" 3单元;在l 2 .... l19
中,返回l1
中的3个单位小元素(新列表)。
你知道怎么用一行吗?
答案 0 :(得分:2)
将所有其他列表放入更大的列表,并使用set.union
superlist = [l3, ..., l19]
s = set(l2).union(*superlist)
a2 = [x for x in l1 if x+3 in s]
当然,您可以决定将列表直接传递给set.union
。
使用集合查找成员资格 - O(1)复杂度 - 比列表更快 - O(n)。
答案 1 :(得分:1)
a2 = [x for x in l if x+3 in l1+l2+l3+l4+l5+...+l19]
为了完整起见,这里还有另一个单行内容,受到其他答案的启发,你可以使用超过19个列表:
a2=[x for x in l if x+3 in set().union(*[eval('l'+str(i+1)) for i in range(19)])]
但......
注意
这样的单线程看起来非常好,但是如果有非常大的列表,那么致命(它们可以在非常浪费的时间内不必占用你所有的CPU功率),所以你很乐意使用多线程:
bigL = l1+l2+l3+l4+l5+...+l19
setBigL = set(bigL)
a2 = [x for x in l if x+3 in setBigL]
为了完整起见,如何在不需要编写所有列表名称的情况下获取bigL
:
noOfLists = 19; strListAddition = ''
for i in range(19): strListAddition+='l'+str(i+1)+'+'
bigL = eval(strListAddition[0:-1])
答案 2 :(得分:0)
如果我没有误解你的意思,你可以尝试这个,如果你有一个列表,只需更改range
部分:
l1 = [4, 6,10,11,13,14]
l2 = [1,2,3,6,5,7,8,9]
l3=[3,7,10,11]
print([x for i in range(2,4) for x in eval('l'+str(i)) if x+3 in l1])
输出:
[1, 3, 7, 8, 3, 7, 10, 11]