Python列表收缩

时间:2012-02-28 06:06:45

标签: python list sorting

我无法实现执行以下操作的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]]

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

我一直难以理解如何以一种有效的方式实现这一点,并希望得到一些关于如何实现这一点的建议/建议。

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

谢谢!

5 个答案:

答案 0 :(得分:1)

使用itertools.groupby()

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))]

使用字典:

result = {}
for k, v in data:
    result.setdefault(k, []).append(v)
result = sorted([k] + v for k, v in result.iteritems())

答案 1 :(得分:0)

试试这个:

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])

UPD:你也可以用

替换最后一行
        friendOfFriends[f1].update(friends.get(f2,()))

friends集合

中出现空集

答案 2 :(得分:0)

如果没有Ultimately部分,您只需执行此操作:

>>> 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]]

答案 3 :(得分:0)

这是快速而简单的,因为我可以得到它:

data=iter([[0,1], [0,4], [0,3], [0,423], [1,232], [1,2], [2,444], [2,12]])
result = [next(data)]

for pair in  data:
    if result[-1][0]==pair[0]:
        result[-1].append(pair[1])
    else:
        result.append(pair)

print result
"[[0, 1, 4, 3, 423], [1, 232, 2], [2, 444, 12]]"

答案 4 :(得分:0)

temp =  [[0,1], [0,4], [0,3], [0,432], [1,232], [1,2], [2,444], [2,12]]

temp1 = set()

temp2 = dict()

    for i in temp:

        first = i[0]
        second = i[1]
        if first in temp1:
            temp2[first] = temp2[first] + [second]
        else:
            temp2[first] = [second]
        temp1.add(i[0])

此处temp2将具有所需的结果。