Есть ли правильная функция для объединения двух списков и выравнивания одновременно?

#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:

Стандартной функции нет, но понимание этого списка совершенно нормально, хотя оно могло бы быть более идиоматичным:

  1. Нет необходимости в промежуточном списке test
  2. Распакуйте, чтобы вы могли использовать описательные имена, такие как 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')]