Как связать неравные списки как продукт первого списка с другими? - PullRequest
0 голосов
/ 02 июля 2018

У меня есть несколько списков, таких как следующие -

list1=['Tom']
list2=[16]
list3=['Maths','Science','English']
list4=['A','B','C']

Я хочу сжать эти списки, чтобы получить следующее отображение -

желаемых результатов-

[('Tom', 16, 'Maths','A'), ('Tom', 16, 'Science','B'), ('Tom', 16, 'English','C')]

Результат, который я получаю, используя следующую команду-

results=zip(list1,list2,list3,list4)
[('Tom', 16, 'Maths','A')]

это всего лишь пример моей проблемы. Если предоставлено обобщенное решение, это будет полезно. Если я использую утверждение -

res= itertools.izip_longest(*[x[c] for c in cols])

Я получаю несколько строк, но получаю значение NULL для столбца имени и возраста. Также рассмотрите возможность передачи имен столбцов описанным выше способом, поскольку имена столбцов не являются статическими.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы не просматриваете zip 4 списков, поскольку, как вы подтвердили, первые 2 списка содержат только один элемент.

Вместо этого используйте понимание списка и zip только последние 2 списка:

name, age = list1[0], list2[0]
res = [(name, age, subject, grade) for subject, grade in zip(list3, list4)]

print(res)

[('Tom', 16, 'Maths', 'A'),
 ('Tom', 16, 'Science', 'B'),
 ('Tom', 16, 'English', 'C')]
0 голосов
/ 02 июля 2018

Я предполагаю, что list4 - это список с наибольшим количеством элементов.

list1 = ['Tom']
list2 = [16]
list3 = ['Maths', 'Science', 'English']
list4 = ['A', 'B', 'C']
longest = (list4 if (len(list4) > len(list3)) else list3)
shortest = (list3 if (longest == list4) else list4)

for list_ in (list1, list2, shortest):
    while len(list_) < len(longest):
        list_.append(list_[-1])

zip_list = zip(list1, list2, shortest, longest)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...