首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保留顺序的同时通过键将python列表分解为子列表的最有效方法

在保留顺序的同时通过键将python列表分解为子列表的最有效方法
EN

Stack Overflow用户
提问于 2016-08-03 17:14:21
回答 3查看 250关注 0票数 4

这里的第一张海报。如果我有一个包含具有不同信息的子列表的列表,并且希望将所有具有相同键值的子列表分组到一个新的子列表中(例如,根据键值对列表进行惟一化),那么最有效的方法是什么?

示例:

代码语言:javascript
复制
A = [[1,2,3], [1,3,7], [2,1,3], [8,9,6], [3,7,9], [2,3,8], [1,2,4]]

我希望将“0”索引中具有相同项的所有子列表分组到一个新的子列表中,最好保持原来的顺序:

代码语言:javascript
复制
B = [ [[1,2,3], [1,3,7], [1,2,4]], [[2,1,3],[2,3,8]], [[8,9,6]], [[3,7,9]] ] 

我已多次解决这个问题,但我想看看是否有更有效的方法。是的,出于这个原因,我可以使用numpy包,但我对列表解决方案感兴趣。

通常,我首先要对每个子列表中的第一个索引中的项进行惟一化(如果我不担心效率或顺序的话,可以使用set方法),然后循环整个列表,将子列表组合成一个新的子列表:

代码语言:javascript
复制
def getUniqueList(list):
    seen = []
    for e in list:
        if e not in seen:
        seen.append(e)
    return seen

def uniquify(list):
    # Get all items from the first column
    new_list = [item[0] for item in list]
    return getUniqueList(new_list)

def rearrangeList(A, A_0):
    B = []
    for i in range(len(A_0)):
        B.append([])
    for i in range(len(A)):
        index = A_0.index(A[i][0])
        B[index].append(A[i])
    return B

A = [[1,2,3], [1,3,7], [2,1,3], [8,9,6], [3,7,9], [2,3,8], [1,2,4]]
A_0 = uniquify(A) # Contains all unique keys in index 0 of list A
B = rearrangeList(A, A_0)
print(B)

这应该(我没有测试这个,但这就是我编写它的方式)的结果是:

B= [1,2,3,1,3,7,1,2,4],[2,1,3,2,3,8],[8,9,6],[3,7,9]

我想知道,在效率方面是否有更好的方法来做到这一点,以及( 2)是否有一种方法可以以较少的步骤(不一定是有效的,只是好奇地)做到这一点。希望这个问题提出得很好,但是如果需要编辑的话,请告诉我!

EN

Stack Overflow用户

发布于 2016-08-03 19:02:28

保持原始列表顺序的要求是有趣的。

假设您的列表是A,并且您希望在B中获得结果,下面的代码将在它使用输入时构造该列表,从而保留列表的原始顺序:

代码语言:javascript
复制
from collections import defaultdict
B=[]
reduce(lambda a,n: a[n[0]].append(n) or a,A,defaultdict(lambda: B.append([]) or B[-1]))

或者下面的简单代码在defaultdict中创建列表,然后复制,但是原始列表的顺序丢失了:

代码语言:javascript
复制
from collections import defaultdict
B=reduce(lambda a,n: a[n[0]].append(n) or a,A,defaultdict(list)).values()

注意,子列表将按照它们最初出现的顺序排列。

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38749895

复制
相关文章

相似问题

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