我有两个列表。一个列表只具有随机顺序的元素(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
上循环一百万次。
怎样才能让这段代码更有效率呢?
发布于 2015-12-18 16:42:40
有没有什么原因你不能使用字典(例如,第一个元素是重复的吗?)然后做一些类似的事情:
>>> 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']]
发布于 2015-12-18 16:45:06
您可以将列表转换为字典,然后在执行列表理解时循环遍历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
发布于 2015-12-18 18:08:59
另一种方法是首先过滤第一项存在于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']]
https://stackoverflow.com/questions/34360039
复制相似问题