我有两个清单。一个列表只有随机顺序的元素(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
一百万次。
如何提高此代码的效率?
答案 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']]