从另一个列表中提取列表的一部分

时间:2015-12-18 16:33:24

标签: python list

我有两个清单。一个列表只有随机顺序的元素(y),而另一个有序列表具有列表子集(x)。这些列表子集的第一个元素与随机列表相同。

我希望第二个列表中的所有元素都出现在第一个列表中,但是顺序相同。这是一个例子:

输入:

x = [[1,'a'],[2,'b'],[3,'c'],[4,'d'],[5,'d']]
y = [4,1,2]

必需输出:

[[4, 'd'], [1, 'a'], [2, 'b']] # Same sequence as y but elements in x

我已经写了一些代码来实现这个目标:

for i in range(0,len(y)):
    for k in range(0,len(x)):
        if y[i] ==x[k][0]:
            d.append(x[k])

但是,我不确定这是否是最有效的解决方法。这只是一个示例,实际上,我的列表x包含超过一百万个子列表,因此如果我尝试使用此代码,它将循环x一百万次。

如何提高此代码的效率?

3 个答案:

答案 0 :(得分:3)

你有什么理由不能使用字典(即,有史以来第一个重复的元素吗?)并做了类似的事情:

>>> d = {1: "a", 2: "b", 3: "c", 4: "d", 5: "d"}
>>> map(lambda x: [x,d.get(x)], [4,1,2])
[[4, 'd'], [1, 'a'], [2, 'b']]

答案 1 :(得分:1)

您可以将列表列表转换为字典,然后在执行列表理解时循环遍历y列表

x = [[1,'a'],[2,'b'],[3,'c'],[4,'d'],[5,'d']]
d = dict(x)
y=[4,1,2]
newlist = [[i,d[i]] for i in y]
print newlist

答案 2 :(得分:1)

另一种方法是首先过滤y中存在第一个项目的元素,然后将结果列表与y相同的顺序排序:

>>> x
[[1, 'a'], [2, 'b'], [3, 'c'], [4, 'd'], [5, 'd']]
>>> y
[4, 1, 2]
>>> l = filter(lambda s:s[0] in y, x)
>>> l
[[1, 'a'], [2, 'b'], [4, 'd']]
>>> sorted(l, key=lambda s: y.index(s[0]))
[[4, 'd'], [1, 'a'], [2, 'b']]