Перебирать список кортежей и распаковывать только первые элементы - PullRequest
1 голос
/ 14 июня 2019

Допустим, следующий список: foo = [(1, 2, 3, 4), (5, 6, 7, 8)]

Есть ли способ перебрать список и распаковать только первые два элемента внутреннего кортежа?

Это обычный шаблон:{a: b for a, b, _, _ in foo}, но это нарушается, если foo изменено (изменение программы), и кортеж теперь содержит 5 элементов вместо 4 (понимание списка должно быть соответственно изменено).Мне действительно нравится называть элементы вместо вызова {f[0]: f[1] for f in foo}, поэтому в идеале было бы какое-то «поглощать все не распакованные переменные», поэтому можно было бы назвать {a: b for a, b, absorb_rest in foo}.Если это возможно, не имеет значения, сколько элементов содержится в кортеже (если их не меньше 2).

Ответы [ 4 ]

3 голосов
/ 14 июня 2019

Попробуйте это:

dict_ = {a:b for a,b, *_ in foo}

Выход :

{1: 2, 5: 6}

Если foo изменено на [(1, 2, 3, 4,9,0), (5, 6, 7, 8, 11, 16)] программой позже, dict_ все еще остается: {1: 2, 5: 6}

3 голосов
/ 14 июня 2019

Вы можете использовать расширенную итеративную распаковку , сохраняя таким образом первые два значения из итерируемой и игнорируя остальные:

{a: b for a, b, *_ in foo}
# {1: 2, 5: 6}
3 голосов
/ 14 июня 2019

Вы можете использовать расширенную итеративную распаковку , где вы извлекаете первые два элемента кортежа и игнорируете остальные элементы.Обратите внимание, что это работает только для python3

{a:b for a, b, *c in foo}                                                                                                                                                             
0 голосов
/ 14 июня 2019

использование lambda

foo = [(1, 2, 3, 4), (5, 6, 7, 8)]
output = list(map(lambda x:{x[0]:x[1]}, foo))
print(output)

вывод

[{1: 2}, {5: 6}]
...