我想創建一個函式,它遍歷一個陣列并組合每個陣列的第三個元素,如果它們具有相同的前兩個元素,但是我能想到的唯一方法具有非常高的復雜性,任何推薦的演算法 [python 首選,但任何偽代碼或演算法會做]:
示例輸入 -> Delta = [ [0, 0, '1'], [0, 1, '1'], [1, 2, '0'], [1, 2, '1'], [2, 2, '0'], [2, 2, '1'] ]
預期輸出 -> Delta = [ [0, 0, '1' ], [0, 1, '1' ], [1, 2, '0, 1' ], [2, 2, '0, 1' ] ]
謝謝你的時間
uj5u.com熱心網友回復:
您可以對串列進行排序,然后使用回圈:
from typing import List, Union
def merge_lists(lists: List[List[Union[int, str]]]) -> List[List[Union[int, str]]]:
"""Merges lists based on first two elements."""
if not lists:
return lists
sorted_lists = sorted(lists)
result = [sorted_lists[0]]
for sub_list in sorted_lists[1:]:
curr_first, curr_second, key = sub_list
prev_first, prev_second, *keys = result[-1]
if curr_first == prev_first and curr_second == prev_second and key not in keys:
result[-1].append(key)
else:
result.append(sub_list)
return [[first, second, ', '.join(keys)] for first, second, *keys in result]
lists = [[0, 0, '1'], [0, 1, '1'], [1, 2, '0'], [1, 2, '1'], [2, 2, '0'], [2, 2, '1']]
print(f'{lists = }')
print(f'{merge_lists(lists) = }')
輸出:
lists = [[0, 0, '1'], [0, 1, '1'], [1, 2, '0'], [1, 2, '1'], [2, 2, '0'], [2, 2, '1']]
merge_lists(lists) = [[0, 0, '1'], [0, 1, '1'], [1, 2, '0, 1'], [2, 2, '0, 1']]
如果前兩個元素是字串而不是數字,請使用類似natsort.
uj5u.com熱心網友回復:
你可以使用itertools.groupby這個(和operator.itemgetter):
from itertools import groupby
from operator import itemgetter
delta = [ [0, 0, '1'], [0, 1, '1'], [1, 2, '0'], [1, 2, '1'], [2, 2, '0'], [2, 2, '1'] ]
result = [
[*key, ", ".join(map(itemgetter(2), group))]
for key, group in groupby(sorted(delta), key=itemgetter(0, 1))
]
注意:sorted僅當輸入尚未排序時才需要 - 您的示例已排序。
uj5u.com熱心網友回復:
排序資料的分組可以通過以下方式完成itertools.groupby:請參閱 trincot 的答案。
未排序資料的分組可以通過dict串列來完成:
def combine_third_on_first_two(delta):
d = {}
for a,b,c in delta:
d.setdefault((a,b), []).append(c)
return [(a, b, ', '.join(l)) for (a,b),l in d.items()]
delta = [ [0, 0, '1'], [0, 1, '1'], [1, 2, '0'], [1, 2, '1'], [2, 2, '0'], [2, 2, '1'] ]
print(combine_third_on_first_two(delta))
# [(0, 0, '1'), (0, 1, '1'), (1, 2, '0, 1'), (2, 2, '0, 1')]
這個分組dict非常標準,并且已經在外部模塊中實作more_itertools,如more_itertools.map_reduce:
from more_itertools import map_reduce
from operator import itemgetter
delta = [ [0, 0, '1'], [0, 1, '1'], [1, 2, '0'], [1, 2, '1'], [2, 2, '0'], [2, 2, '1'] ]
d = map_reduce(delta,
keyfunc=itemgetter(0, 1), valuefunc=itemgetter(2), reducefunc=', '.join)
result = [(a,b,s) for (a,b), s in d.items()]
print(result)
# [(0, 0, '1'), (0, 1, '1'), (1, 2, '0, 1'), (2, 2, '0, 1')]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/477487.html
