首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从另一个列表提取列表的一部分

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

Stack Overflow用户
提问于 2015-12-19 00:33:24
回答 3查看 708关注 0票数 0

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

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

输入:

代码语言:javascript
代码运行次数:0
运行
复制
x = [[1,'a'],[2,'b'],[3,'c'],[4,'d'],[5,'d']]
y = [4,1,2]

所需输出:

代码语言:javascript
代码运行次数:0
运行
复制
[[4, 'd'], [1, 'a'], [2, 'b']] # Same sequence as y but elements in x

我已经写了一些代码来实现这一点:

代码语言:javascript
代码运行次数:0
运行
复制
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上循环一百万次。

怎样才能让这段代码更有效率呢?

EN

回答 3

Stack Overflow用户

发布于 2015-12-19 00:42:40

有没有什么原因你不能使用字典(例如,第一个元素是重复的吗?)然后做一些类似的事情:

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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']]
票数 3
EN

Stack Overflow用户

发布于 2015-12-19 00:45:06

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

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2015-12-19 02:08:59

另一种方法是首先过滤第一项存在于y中的元素,然后按照y的顺序对结果列表进行排序

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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']]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34360039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档