从python中的19个列表中创建一个列表

时间:2017-04-08 11:05:45

标签: python

我在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个单位小元素(新列表)。 你知道怎么用一行吗?

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]