首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python列表收缩

Python列表收缩
EN

Stack Overflow用户
提问于 2012-02-28 14:06:45
回答 5查看 1.4K关注 0票数 0

我在实现python算法时遇到了问题,该算法执行以下操作:(这是尝试实现朋友之友算法的一部分)

给定形式为[a,b,c,d,e,f,...]的列表我想创建一个新的列表,格式为[a,a1,a2,a3,...,b,b1,b2,b3,...,c,c1,c2,c3,...,...]。

下面是一个更清晰的例子:给定一个列表[0,1,0,4,0,3,0,423,1,232,1,2,2,444,2,12]

我希望输出以第一个整数对所有元素进行分组,因此输出将是[0,1,4,3,432,1,232,2,2,444,12]

注意:我已经根据每个项目中的第一个元素对输入列表进行了排序。

一段时间以来,我一直被如何以某种有效的方式实现这一点难住了,我很想得到一些关于如何实现这一点的建议/建议。

附言:最终,我希望这个组合所有的“喜欢”的术语。我的意思是举上面的例子,而不是得到输出[0,1,4,3,432,1,232, 2,2,444,12],我会得到[0,1,4,3,432,1,232,2,444,12],其中"2“项及其共享元素加入了与"1”项相关联的元素,因为1与2相关联。这最后一部分可能会令人困惑,但如果它有意义,也欢迎建议!否则,请忽略最后这部分。=]再次感谢!

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-28 14:33:48

试试这个:

代码语言:javascript
复制
from collections import defaultdict

friends = defaultdict(set)
friendpairs =  [[0,1], [0,4], [0,3], [0,432], [1,232], [1,2], [2,444], [2,12]]

for f1,f2 in friendpairs : friends[f1].add(f2)

friendOfFriends = dict( (guy,fr.copy()) for guy,fr in friends.iteritems())

for f1 in friendOfFriends:
    for f2 in friends[f1]:
        friendOfFriends[f1].update(friends[f2])

更新:您也可以将最后一行替换为

代码语言:javascript
复制
        friendOfFriends[f1].update(friends.get(f2,()))

防止friends集合中出现空集

票数 0
EN

Stack Overflow用户

发布于 2012-02-28 14:35:19

使用itertools.groupby()

代码语言:javascript
复制
from itertools import groupby
from operator import itemgetter

data = [[0, 1], [0, 4], [0, 3], [0, 423], [1, 232], [1, 2], [2, 444], [2, 12]]
result = [[k] + list(zip(*g)[1]) for k, g in groupby(data, key=itemgetter(0))]

使用字典:

代码语言:javascript
复制
result = {}
for k, v in data:
    result.setdefault(k, []).append(v)
result = sorted([k] + v for k, v in result.iteritems())
票数 1
EN

Stack Overflow用户

发布于 2012-02-28 14:36:20

在没有Ultimately部件的情况下,您只需执行以下操作:

代码语言:javascript
复制
>>> a = [[0,1], [0,4], [0,3], [0,423], [1,232], [1,2], [2,444], [2,12]]
>>> d = dict()
>>> for x, y in a:
...     if x in d:
...             d[x].append(y)
...     else:
...             d[x] = [y]
...
>>> d
{0: [1, 4, 3, 423], 1: [232, 2], 2: [444, 12]}
>>> [[x] + d[x] for x in d]
[[0, 1, 4, 3, 423], [1, 232, 2], [2, 444, 12]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9477201

复制
相关文章

相似问题

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