Хороший способ перебирать списки разной длины и устанавливать значение по умолчанию - PullRequest
0 голосов
/ 29 июня 2018

Есть ли в Python хороший способ перебирать списки разной длины?

Например,

a = [1,2,3]

b=[4,5]

c = [a,b]

for val1, val2, val3 in c:

  print val1
  print val2
  print val3

Предполагая, что список будет иметь как минимум 2 значения, а в каком-то списке 3-е значение является необязательным. Вышеупомянутый цикл for не работал для b, очевидно, что val3 недоступен для списка 'b'. В этом случае я хочу напечатать val3 как 0. Могу ли я указать значение по умолчанию в случае недоступности?

for val1, val2, val3=0 in c:

Приведенный выше синтаксис также не работал. Пожалуйста, помогите.

Ответы [ 5 ]

0 голосов
/ 29 июня 2018

Самый простой способ объединения списков - это функция chain из модуля itertools.

Пример фрагмента

import itertools

a = [1, 2, 3, 4, 5, 6]
b = [7, 8, 9, 10, 11, 12]
c = ['A', 'B', 'C', 'D', 'E', 'F', 'U']


combined = itertools.chain( a, b, c ) # combines in order

# enumerate lists to allow for iteration
for index, value in enumerate(combined):
    print(value, end = ' ')

Выход

1 2 3 4 5 6 7 8 9 10 11 12 A B C D E F U
0 голосов
/ 29 июня 2018
def foreach(l):
    def deco(f):
        for xs in l:
            f(*xs)
    return deco


@foreach([[1, 2, 3], [4, 5]])
def _(a, b, c=6):
    print(a, b, c, sep='\n')
0 голосов
/ 29 июня 2018

это очень просто

c = [1,2,3]
val1  , val2  , *val3= [1,2 , 3]

val1 = 1, val2 = 3, val3 = [3]

c=[1,2]
val1  , val2  , *val3= [1,2 , 3]

val1 = 1, val2 = 3, val3 = []

0 голосов
/ 29 июня 2018

Вы можете использовать zip_longest с fillvalue для обработки пустого слота для этого случая:

from itertools import zip_longest

a = [1,2,3]
b = [4,5]

l = []
for x, y in zip_longest(a, b, fillvalue=0):
    l.append((x, y))

print(list(zip(*l)))
# [(1, 2, 3), (4, 5, 0)]

Если вам нужны значения вне списка, просто замените последний print на:

for val1, val2, val3 in zip(*l):
    print(val1)
    print(val2)
    print(val3)

# 1
# 2                                                           
# 3                                                          
# 4                                                          
# 5                                                          
# 0
0 голосов
/ 29 июня 2018

Если вы хотите быть модным («элегантным»?), Вы можете дополнить заданный список нулями:

def pad_list(t, size, default):
    return t + [default] * (size - len(t))

for x in c:
    v1, v2, v3 = pad_list(x, 3, 0)

    print(v1)
    print(v2)
    print(v3)

Аналогично, если вы работаете с кортежами, вот еще одна функция:

def pad_list(t, size, default):
    return t + (default,) * (size - len(t))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...