簡體   English   中英

Python 列表收縮

[英]Python List Contraction

我在實現執行以下操作的 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]]

注意:我已經根據每個項目中的第一個元素對輸入列表進行了排序。

一段時間以來,我一直困擾着如何以某種有效的方式實現這一點,並且很想就如何實現這一點獲得一些建議/建議。

PS 最終我希望它結合所有“喜歡”的術語。 我的意思是拿上面的例子來說,而不是得到輸出 [[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 相關聯。這最后一部分可能令人困惑,但如果有意義,建議也將受到歡迎! 否則忽略這最后一部分。 =] 再次感謝!

謝謝!

使用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())
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 將具有所需的結果。

嘗試這個:

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集合中出現空集

如果沒有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]]

這是快速而簡單的,因為我可以得到它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM