zip () с необязательными параметрами - PullRequest
0 голосов
/ 15 октября 2019

Я хочу перебрать необязательные параметры, упрощенный пример:

a = [1,2,3]
b = [4,5,6]
c = {'function':['add','add','multiply']}

for i in zip(a, b, *c):
    if i['function'] == 'add':
        print(i[0] + i[1])
    elif i['function'] == 'multiply':
        print(i[0] * i[1])

В настоящее время это не работает, но я не уверен, почему после прочтения записи * здесь: https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists

Мне кажется, что итератор должен вернуть 2 индекса из i вместе с именованными значениями из словаря?

Как правильно реализовать эту логику?

Обновление 2019-10-16

Спасибо за все ваши ответы, но я не думаю, что правильно объяснил свою идею.

Моя конечная цель - выполнить итерацию значений форматирования из словаря:

labels = ['Car', 'Van', 'Bike']

font_list = {'bold':[True, True, False],
             'italic'=[False, True, True]}

font = {'underline':False}


for i in zip(labels, *font_list):
    if 'bold' in i:
        bold = i['bold']
    else:
        bold = font['bold']
    addLabelToPlot(label=i[0], bold=bold, ...)
    ...

Если формат отличается для каждой метки, он будет помещен в словарь font_list, иначе он будетбыть помещенным в словарь font.

Ответы [ 3 ]

2 голосов
/ 15 октября 2019

Это потому, что ваш код дает следующее при выполнении

print(list(zip(a, b, *c))

, что дает:

[(1, 4, 'f'), (2, 5, 'u'), (3, 6, 'n')]

Вы видите, что мы сопоставляем только первый символ в строке, но если мы вместо этогосделайте вот так

for i in zip(a, b, c['function']):

Мы получим следующий вывод:

[(1, 4, 'add'), (2, 5, 'add'), (3, 6, 'multiply')]

и тогда код может выглядеть так:

a = [1, 2, 3]
b = [4, 5, 6]
c = {'function': ['add', 'add', 'multiply']}

for i in zip(a, b, c['function']):
    if i[2] == 'add':
        print(i[0] + i[1])
    elif i[2] == 'multiply':
        print(i[0] * i[1])

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

a = [1, 2, 3]
b = [4, 5, 6]
c = {'function': ['add', 'add', 'multiply']}

for n1, n2, operation in zip(a, b, c['function']):
    if operation == 'add':
        print(n2 + n2)
    elif operation == 'multiply':
        print(n1 * n2)
2 голосов
/ 15 октября 2019

Вы должны использовать c['function']

 for i in zip(a, b, c['function']):

и позже у вас будет i[2] вместо i['function']

a = [1,2,3]
b = [4,5,6]
c = {'function':['add','add','multiply']}

for i in zip(a, b, c['function']):
    if i[2] == 'add':
        print(i[0] + i[1])
    elif i[2] == 'multiply':
        print(i[0] * i[1])
0 голосов
/ 15 октября 2019
a = [1,2,3]
b = [4,5,6]
c = {'function':['add','add','multiply']}
def deee(a,b,function):
    for i in zip(a, b, function):
    if i[2] == 'add':
        print(i[0] + i[1])
    elif i[2] == 'multiply':
        print(i[0] * i[1])
deee(a,b,**c)

вы можете использовать вот так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...