簡體   English   中英

在n個不相等的列表中查找最高值

[英]Find highest values in n unequal lists

我有n個列表的列表。

data = [
    [1, 2, 3, 4, 5, 6, 7, 8],
    [2, 6, 3, 5, 9, 1, 1, 1, 2, 4, 5],
    [8, 1, 4, 1, 2, 3, 4, 2, 5]
    [3, 9, 1, 2, 2, 1, 1, 5, 9, 3]
]

如何有效地比較它們並生成一個總是包含當前位置最高值的列表? 我不知道如何做到這一點,因為每個列表的邊界是不同的。

上面示例的輸出應該是包含以下值的列表:

[8,9,4,5,9,6,7,8,9,4,5]

最慣用的方法是轉置2D列表並在轉置列表中的每一行上調用max 但在你的情況下,你正在處理不規則的列表 ,所以zip不能直接在這里應用(它只會拉到最短的列表)。

相反,使用itertools.zip_longestizip_longest用於python 2),然后使用map應用max -

from itertools import zip_longest
r = list(map(max, zip_longest(*data, fillvalue=-float('inf'))))

或者,使用@Peter DeGlopper的建議 ,列表理解 -

r = [max(x) for x in zip_longest(*data, fillvalue=-float('inf'))]

print(r)
[8, 9, 4, 5, 9, 6, 7, 8, 9, 4, 5]

在這里,我使用fillvalue參數來填充負無窮大的缺失值。 中間結果看起來像這樣 -

list(zip_longest(*data, fillvalue=-float('inf')))

[(1, 2, 8, 3),
 (2, 6, 1, 9),
 (3, 3, 4, 1),
 (4, 5, 1, 2),
 (5, 9, 2, 2),
 (6, 1, 3, 1),
 (7, 1, 4, 1),
 (8, 1, 2, 5),
 (-inf, 2, 5, 9),
 (-inf, 4, -inf, 3),
 (-inf, 5, -inf, -inf)]

現在,應用max變得簡單 - 只需在每一行上執行即可完成。

在這種情況下, zip_longest是你的朋友。

from itertools import zip_longest

data = [
    [1, 2, 3, 4, 5, 6, 7, 8],
    [2, 6, 3, 5, 9, 1, 1, 1, 2, 4, 5],
    [8, 1, 4, 1, 2, 3, 4, 2, 5],
    [3, 9, 1, 2, 2, 1, 1, 5, 9, 3],
]

output = list()

for x in zip_longest(*data, fillvalue=0):
  output.append(max(x))

print(output)
>>> [8, 9, 4, 5, 9, 6, 7, 8, 9, 4, 5]

添加pandas解決方案

import pandas as pd 

pd.DataFrame(data).max().astype(int).tolist()
Out[100]: [8, 9, 4, 5, 9, 6, 7, 8, 9, 4, 5]

您可以使用itertools.izip_longest (Python3中的itertools.zip_longest ):

Python2:

import itertools
data = [
[1, 2, 3, 4, 5, 6, 7, 8],
[2, 6, 3, 5, 9, 1, 1, 1, 2, 4, 5],
[8, 1, 4, 1, 2, 3, 4, 2, 5],
[3, 9, 1, 2, 2, 1, 1, 5, 9, 3],
]
new_data = [max(filter(lambda x:x, i)) for i in itertools.izip_longest(*data)]

輸出:

[8, 9, 4, 5, 9, 6, 7, 8, 9, 4, 5]

Python3:

import itertools
data = [
[1, 2, 3, 4, 5, 6, 7, 8],
[2, 6, 3, 5, 9, 1, 1, 1, 2, 4, 5],
[8, 1, 4, 1, 2, 3, 4, 2, 5],
[3, 9, 1, 2, 2, 1, 1, 5, 9, 3],
]
new_data = [max(filter(None, i)) for i in itertools.zip_longest(*data)]

你不需要任何外部模塊,只需使用一些邏輯就可以了:

data = [
    [1, 2, 3, 4, 5, 6, 7, 8],
    [2, 6, 3, 5, 9, 1, 1, 1, 2, 4, 5],
    [8, 1, 4, 1, 2, 3, 4, 2, 5],
    [3, 9, 1, 2, 2, 1, 1, 5, 9, 3]
]

new_data={}
for j in data:
    for k,m in enumerate(j):
        if k not in new_data:
            new_data[k] = [m]
        else:
            new_data[k].append(m)




final_data=[0]*len(new_data.keys())

for key,value in new_data.items():
    final_data[key]=max(value)

print(final_data)

輸出:

[8, 9, 4, 5, 9, 6, 7, 8, 9, 4, 5]

暫無
暫無

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

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