只需調換子表,並從每個組的Counter.most_common
元素鍵:
from collections import Counter
lists = [[1, 2, 3],[1, 4, 4],[0, 2, 4]]
print([Counter(sub).most_common(1)[0][0] for sub in zip(*lists)])
如果他們是單獨的列表,只需zip那些:
l1, l2, l3 = [1, 2, 3], [1, 4, 4], [0, 2, 4]
print([Counter(sub).most_common(1)[0][0] for sub in zip(l1,l2,l3)])
不知道如何從分組中獲取第一個元素是否合理,因爲它可能不是綁定的那個實例,只是得到兩個most_common並檢查它們的計數是否相等:
def most_cm(lists):
for sub in zip(*lists):
# get two most frequent
comm = Counter(sub).most_common(2)
# if their values are equal just return the ele from l1
yield comm[0][0] if len(comm) == 1 or comm[0][1] != comm[1][1] else sub[0]
我們還需要if len(comm) == 1
的情況下,所有的元素都是相同的,否則我們會得到一個IndexError。
如果你正在討論的是在領帶事件中採用來自先前列表的元素,即l2在l5之前,那麼這與採取任何配合的元素相同。
對於子列表的一個體面的數量:
In [61]: lis = [[randint(1,10000) for _ in range(10)] for _ in range(100000)]
In [62]: list(most_cm(lis))
Out[62]: [5856, 9104, 1245, 4304, 829, 8214, 9496, 9182, 8233, 7482]
In [63]: timeit list(most_cm(lis))
1 loops, best of 3: 249 ms per loop
你到目前爲止嘗試過什麼?如果可能,請發佈[MCEV](http://stackoverflow.com/help/mcve)。 – Gabriel
@Gabriel我用if/else實現了一個循環,但很快就看起來像個糟糕的主意 – user
如果有領帶怎麼辦?所有的列表都是一樣的長度嗎?你只想比較相同的索引? –