2015-08-27 74 views
0

我有一個多維列表,像下面在多維列表中計算相同列表的發生頻率?

multilist = [[1,2],[3,4,5],[3,4,5],[5,6],[5,6],[5,6]] 

我怎樣才能得到如下效果快:

[1,2]: count 1 times 
[3,4,5]: count 2 times 
[5,6]: count 3 times 

,並也得到了獨特的多維表(刪除重複項):

multi_list = [[1,2],[3,4,5],[5,6]] 

非常感謝。

+2

只是好奇,你有沒有嘗試過嗎?完成任何研究? –

+0

您是否嘗試過某些東西,或者您要求我們做功課? – Hearner

+0

'map(list,set(map(tuple,multilist)))'? – thebjorn

回答

1

您可以使用元組,其是可哈希和collections.Counter

>>> multilist = [[1,2],[3,4,5],[3,4,5],[5,6],[5,6],[5,6]] 
>>> multituples = [tuple(l) for l in multilist] 
>>> from collections import Counter 
>>> tc = Counter(multituples) 
>>> tc 
Counter({(5, 6): 3, (3, 4, 5): 2, (1, 2): 1}) 

要獲得元素的集合,你只需要按鍵:

>>> tc.keys() 
dict_keys([(1, 2), (3, 4, 5), (5, 6)]) 
+1

'list.count'適用於列表元素,也是列表... – thebjorn

+0

這也是設置部分以及...(通過獲取鍵) –

+0

我猜你的順序最終結果不能保證與原始訂單相同嗎? – thebjorn

0

你可以嘗試這樣的,

>>> multilist = [[1,2],[3,4,5],[3,4,5],[5,6],[5,6],[5,6]] 
>>> c = [multilist.count(l) for l in multilist] 
>>> for ind, l in enumerate(multilist): 
... print("%s: count %d times" % (str(l), c[ind])) 
... 
[1, 2]: count 1 times 
[3, 4, 5]: count 2 times 
[3, 4, 5]: count 2 times 
[5, 6]: count 3 times 
[5, 6]: count 3 times 
[5, 6]: count 3 times 

>>> {str(item): multilist.count(item) for item in multilist } 
{'[1, 2]': 1, '[3, 4, 5]': 2, '[5, 6]': 3} 
+0

這只是(種)一半的問題。 –

+0

非常感謝,就像你回答,但它是不夠的...它可以報告像字典:{'[1,2]':1,'[3,4,5]':2,'' [5,6]':3} –

+0

@ChrinideWu已更新 –

0

As @Reu tSharabani建議,你可以使用元組作爲字典鍵,然後轉換回列表進行顯示。下面的代碼不回覆collections(不是說有什麼問題)。

multilist = [[1,2],[3,4,5],[3,4,5],[5,6],[5,6],[5,6]] 
histogram = {} 
for x in multilist: 
    xt = tuple(x) 
    if xt not in histogram: 
     histogram[xt] = 1 
    else: 
     histogram[xt] += 1 
for k,c in histogram.items(): 
    print "%r: count %d times" % (list(k),c) 
print [list(x) for x in histogram.keys()] 
+0

感謝您的代碼^ _^ –

-1

您可以使用字典這個

count_data = {} 

for my_list in multilist: 
    count_data.setdefault(tuple(my_list), 0) 
    count_data[tuple(my_list)] += 1 
+0

這並沒有解決整個問題。此外,提供關於爲什麼和/或如何代碼回答問題的其他內容可以提高其長期價值。 –

1

如果你想保證的唯一項目的順序是一樣的,在最初的名單,你可以這樣做:

>>> class Seen(set): 
...  def __contains__(self, item): 
...   res = super(Seen, self).__contains__(item) 
...   self.add(item) 
...   return res 
... 
>>> seen = Seen() 
>>> [item for item in multilist if tuple(item) not in seen] 
[[1, 2], [3, 4, 5], [5, 6]] 
>>> 
+0

非常好!謝謝, –

0

如何使用repr(alist)將其轉換爲其文本字符串表示形式?

from collections import defaultdict 

d = defaultdict(int) 
for e in multilist: d[ repr(e)] += 1 

for k,v in d.items(): print "{0}: count {1} times".format(k,v)