#python #python-3.x #list
#питон #python-3.x #Список
Вопрос:
У меня есть список имен, а затем список списков с различными атрибутами для каждого имени (позиция имени эквивалентна позиции списка атрибутов). Я хотел бы объединить эти списки в список кортежей со следующей структурой: [(name, attribute), ...]
Пример Кода:
names = ['alice', 'bob'] attributes = [['tall', 'blue eyes'], ['small']] finished_list = SomeMagicFunction(names, attributes) finished_list [('alice', 'tall'), ('alice', 'blue eyes'), ('bob', 'small')]
Я знаю, что понимание списка, упомянутое ниже, работает (в сочетании с zip()
), но мне было интересно, есть ли подходящая функция, которая может это сделать.
test = list(zip(names, attributes)) [(tuple[0], attribute) for tuple in test for attribute in tuple[1]] [('alice', 'tall'), ('alice', 'blue eyes'), ('bob', 'small')]
Комментарии:
1. Под «правильной функцией» вы подразумеваете ручную реализацию
list(zip())
упомянутого вами метода? Или, скорее, один вызов функции siingle clean, содержащий код?2. @ethanmorton Спасибо за ваш уточняющий вопрос. Под «правильной функцией» я подразумеваю некоторую стандартную функцию
zip()
, подобнуюitertools.product()
, и т. Д., Поскольку, на мой взгляд, это довольно стандартная проблема.3. В некотором смысле использование
list(zip())
-это та более общая функция, которую вы ищете. Как вы упомянули, аспект генератора-это, по сути, то, о чем вы спрашиваете. Большинство разработчиков Python (по крайней мере, из тех, кого я встречал) уже виделиlist(zip())
бы и думали бы об этом как об очень чистой реализации, по сути, как об одном вызове функции, поэтому никто не реализовал ее абстракцию.4. @итан Мортон Хорошо, я думаю, мне просто показалось это странным. Большое спасибо за ваши отзывы!
Ответ №1:
Стандартной функции нет, но понимание этого списка совершенно нормально, хотя оно могло бы быть более идиоматичным:
- Нет необходимости в промежуточном списке
test
- Распакуйте, чтобы вы могли использовать описательные имена, такие как
for name, attrs in zip...
gt;gt;gt; [(name, attr) for name, attrs in zip(names, attributes) for attr in attrs] [('alice', 'tall'), ('alice', 'blue eyes'), ('bob', 'small')]