Python 如何将键控2列表的列表转换为相同键控N列表的列表?

Python 如何将键控2列表的列表转换为相同键控N列表的列表?,python,Python,如何创建以第一个元素为键的列表列表: 发件人: 致: 由于您希望根据一个键对值进行分组,因此可能不是要作为输出查找的列表,而是一个dict。这将允许以后进行固定时间查找 myList = [[26, 'hello'], [26, 'hola'], [26, 'hi'], [26, 'bonjour'], [27, 'bye'], [27, 'doei'], [27, 'see you'], [27, 'tot ziens']] myDict = {} for k, v i

如何创建以第一个元素为键的列表列表:

发件人:

致:


由于您希望根据一个键对值进行分组,因此可能不是要作为输出查找的列表,而是一个dict。这将允许以后进行固定时间查找

myList = [[26, 'hello'], [26, 'hola'], [26, 'hi'], [26, 'bonjour'],
          [27, 'bye'], [27, 'doei'], [27, 'see you'], [27, 'tot ziens']]

myDict = {}

for k, v in myList:
    myDict.setdefault(k, []).append(v)

print(myDict)
输出 虽然如果您确实需要列表列表,您可以这样获得:

# Only valid in Python3, use [k] + v in Python2
listOfLists = [[k, *v] for k, v in myDict.items()]

print(listOfLists)
输出
由于您希望根据一个键对值进行分组,因此可能不是要作为输出查找的列表,而是一个dict。这将允许以后进行固定时间查找

myList = [[26, 'hello'], [26, 'hola'], [26, 'hi'], [26, 'bonjour'],
          [27, 'bye'], [27, 'doei'], [27, 'see you'], [27, 'tot ziens']]

myDict = {}

for k, v in myList:
    myDict.setdefault(k, []).append(v)

print(myDict)
输出 虽然如果您确实需要列表列表,您可以这样获得:

# Only valid in Python3, use [k] + v in Python2
listOfLists = [[k, *v] for k, v in myDict.items()]

print(listOfLists)
输出
最具python风格的方法是使用itertool.groupby对类似的项目进行分组。在分组之前,列表必须按用于分组的相同键排序

from itertools import groupby

[([key] + [word for _, word in words]) for key, words 
   in groupby(sorted(myList), key=lambda x: x[0])]
#[[26, 'bonjour', 'hello', 'hi', 'hola'], 
# [27, 'bye', 'doei', 'see you', 'tot ziens']]

顺便说一下,列表没有键。但字典会这样做。

最具python风格的方法是使用itertool.groupby对类似的项目进行分组。在分组之前,列表必须按用于分组的相同键排序

from itertools import groupby

[([key] + [word for _, word in words]) for key, words 
   in groupby(sorted(myList), key=lambda x: x[0])]
#[[26, 'bonjour', 'hello', 'hi', 'hola'], 
# [27, 'bye', 'doei', 'see you', 'tot ziens']]
顺便说一下,列表没有键。但字典可以。使用itertools.groupby和列表

>>> from itertools import groupby
>>> from operator import itemgetter
>>> myList = [ [26, 'hello'], [26, 'hola'], [26, 'hi'], [26, 'bonjour'], [27, 'bye'],[27, 'doei'], [27, 'see you'], [27, 'tot ziens'] ]
>>> [[k] + [e[1] for e in grps] for k,grps in groupby(myList, itemgetter(0))]
[[26, 'hello', 'hola', 'hi', 'bonjour'], [27, 'bye', 'doei', 'see you', 'tot ziens']]
使用itertools.groupby和列表

>>> from itertools import groupby
>>> from operator import itemgetter
>>> myList = [ [26, 'hello'], [26, 'hola'], [26, 'hi'], [26, 'bonjour'], [27, 'bye'],[27, 'doei'], [27, 'see you'], [27, 'tot ziens'] ]
>>> [[k] + [e[1] for e in grps] for k,grps in groupby(myList, itemgetter(0))]
[[26, 'hello', 'hola', 'hi', 'bonjour'], [27, 'bye', 'doei', 'see you', 'tot ziens']]

我建议您使用此解决方案,它不是优化的,但易于阅读:

from collections import defaultdict

myList = [ [26, 'hello'], [26, 'hola'], [26, 'hi'], [26, 'bonjour'], [27, 'bye'],[27, 'doei'], [27, 'see you'], [27, 'tot ziens'] ]

d = defaultdict(list)
for [k,v] in myList:
     d[k].append(v)
newList = [[k,*v] for k,v in d.items()]

print(newList)  # [[26, 'hello', 'hola', 'hi', 'bonjour'], [27, 'bye', 'doei', 'see you', 'tot ziens']]

我建议您使用此解决方案,它不是优化的,但易于阅读:

from collections import defaultdict

myList = [ [26, 'hello'], [26, 'hola'], [26, 'hi'], [26, 'bonjour'], [27, 'bye'],[27, 'doei'], [27, 'see you'], [27, 'tot ziens'] ]

d = defaultdict(list)
for [k,v] in myList:
     d[k].append(v)
newList = [[k,*v] for k,v in d.items()]

print(newList)  # [[26, 'hello', 'hola', 'hi', 'bonjour'], [27, 'bye', 'doei', 'see you', 'tot ziens']]

这使用嵌套理解:

[[y, *[x[1] for x in myList if x[0]==y]] for y in set([z[0] for z in myList])]
输出:

[[26, 'hello', 'hola', 'hi', 'bonjour'], [27, 'bye', 'doei', 'see you', 'tot ziens']]

这使用嵌套理解:

[[y, *[x[1] for x in myList if x[0]==y]] for y in set([z[0] for z in myList])]
输出:

[[26, 'hello', 'hola', 'hi', 'bonjour'], [27, 'bye', 'doei', 'see you', 'tot ziens']]


但是OP想要的是一个列表列表,而不是列表目录?@DYZ我建议列表目录更适合OP想要的内容。只是一个注释:[k,*v]仅在Py3中有效。感谢@Olivier快速而详细的回复。“它成功了!”加里很高兴我能帮上忙,别忘了你可以接受解决问题的答案。这比感谢更值得赞赏,有助于未来用户找到好答案。但OP想要的是列表列表,而不是列表目录?@DYZ我建议列表目录更适合OP想要的内容。只需注意:[k,*v]仅在Py3中有效。感谢@Olivier的快速详细回复。“它成功了!”加里很高兴我能帮上忙,别忘了你可以接受解决问题的答案。这比感谢更值得赞赏,并帮助未来的用户找到好的答案。在使用groupby之前,您必须按未来分组键对列表进行排序。幸运的是,原始帖子中的列表已经排序,但如果没有排序,groupby会给出错误的答案。首先,你怎么知道?你问过手术医生吗?第二,你的话很粗鲁,不应该这样说。我相信OP已经给出了一个关于他的数据看起来如何的最小样本。出于安全考虑,这不会有什么坏处。在使用groupby之前,你必须按照未来的分组键对列表进行排序。幸运的是,原始帖子中的列表已经排序,但如果没有排序,groupby会给出错误的答案。首先,你怎么知道?你问过手术医生吗?第二你的话很粗鲁,不应该这样说。我相信OP已经给出了一个关于他的数据看起来如何的最小样本。出于安全考虑,这不会有什么坏处。输入总是按第一个列表项排序吗?输入总是按第一个列表项排序吗?三个反对者中的任何一个会解释他们认为这有什么错吗解决方案?很好的回答+1.当我看到这个问题时,首先想到的是SQL groupby。然而,值得注意的一点是,基于dict的解决方案是在logn上的,而这个解决方案是在logn上的,因为调用了sorted。编辑:如果输入被排序,这实际上是打开的,因为TimSort在线性时间内运行,用于排序的输入。@DYZ起初我不同意,因为它没有向OP指出dict是更好的结构。尽管如此,在我看来,这不值得投反对票。让我投赞成票的是,排序在logn上,而使用字典只使用一次遍历,并且在logn上。总之:使用排序根本不是一个有效的解决方案。@OlivierMelançon请参阅上面Lakshay Garg关于排序的评论。@DYZ正如您在其他答案下所评论的,我们不应该假设输入总是被排序的。三位反对者中的任何一位会解释他们认为这个解决方案有什么问题吗?回答得好+1.当我看到这个问题时,首先想到的是SQL groupby。然而,值得注意的一点是,基于dict的解决方案是在logn上的,而这个解决方案是在logn上的,因为调用了sorted。编辑:如果输入被排序,这实际上是打开的,因为TimSort在线性时间内运行,用于排序的输入。@DYZ起初我不同意,因为它没有向OP指出dict是更好的结构。尽管如此,在我看来,这不值得投反对票。让我投赞成票的是,排序在logn上,而使用字典只使用一次遍历,并且在logn上。总之:使用排序根本不是一个有效的解决方案。@OlivierMelançon请参阅上面Lakshay Garg对排序的评论。@DYZ,正如您在其他answe中所评论的那样 rs,我们不应该假设输入总是被排序的。