Мы можем использовать zip_longest
из itertools и множество циклов для достижения результата:
from itertools import zip_longest
result = []
pairs = [[[z, y] for z in x] for y, x in data.items()]
for x in zip_longest(*pairs):
x = [y for y in x if y]
if len(x) > 1:
result.append(min(x, key=lambda x: x[0])[1])
elif x[0][0] < 1:
result.append(x[0][1])
print(result) # => ['data1', 'data2', 'data1', 'data1', 'data1']
Сначала мы создаем пары каждого элемента в каждом значении dict и его ключе,Это облегчает получение ключей результата позже.Мы zip_longest
и перебираем списки, отфильтровывая None
s.Если у нас есть более одного элемента для сравнения, мы берем min и добавляем его к результату, иначе мы проверяем одинокий элемент и сохраняем его, если его значение меньше 1.
Более проверяемый пример:
data = {
'foo': [1, 0, 1, 0],
'bar': [1, 1, 1, 1, 0],
'baz': [1, 1, 0, 0, 1, 1, 0],
'quux': [0],
}
, который производит
['quux', 'foo', 'baz', 'foo', 'bar', 'baz']
По элементам, "quux"
выигрывает раунд 0, "foo"
выигрывает раунд 1, "baz"
2, "foo"
раунд 3 благодаря ключупорядок (связанный с "baz"
), "bar"
для 4-го раунда. Для 5-го раунда "baz"
- последний стоящий, но не ниже 1, поэтому ничего не берется.В 6 раунде "baz"
остается последним, но с 0 <1 берется. </p>