2013-03-29 2 views
7

На самом деле я пытаюсь объединить два списка в одну строку, но сохранить их упорядоченное значение:Объединение двух списков для строки

list1 = [1,2,3,4,5] 
list2 = ["one", "two", "three", "four", "five"] 

result = "1one2two3three4four5five" 

(списки всегда имеют одинаковую длину, но различаются по содержанию)

В в тот момент, я делаю это так:

result = "" 
i = 0 

for entry in list1: 
    result += entry + list2[i] 
    i += 1 

Я думаю, что должно быть более вещий способ сделать это, но я не знаю, это на самом деле.

Может кто-то из вас может помочь мне в этом.

ответ

10
list1 = [1,2,3,4,5] 
list2 = ["one", "two", "three", "four", "five"] 

print ''.join([str(a) + b for a,b in zip(list1,list2)]) 
 
1one2two3three4four5five 
+0

Это [выражение генератора] (http://www.youtube.com/watch?v=pShL9DCSIUw), используемое рядом с ['str.join()'] (http://docs.python.org/3.3 /library/stdtypes.html#str.join). –

+0

Сделайте это в понимании списка, и это будет еще быстрее. Давая '.join() 'генераторное выражение, Python должен создать список из него * в любом случае *, потому что' .join() 'нужно дважды проверять ввод, один раз для вычисления общей длины вывода и один раз для генерации вывода. Понятие '[list comprehension]' быстрее, чем 'list (выражение генератора)'. –

+0

@MartijnPieters Истинная, но простота, вероятно, важнее – jamylak

2
>>> ''.join(str(n)+s for (n,s) in zip(list1, list2)) 
'1one2two3three4four5five' 

Здесь:

  • for (n,s) in zip(list1, list2) перебирает пар элементов в list1 и list2 (т.е. 1 и "one" и т.д.);
  • str(n)+s преобразует каждую пару в строку (например, "1one");
  • ''.join(...) объединяет результаты в одну строку.
2
>>> import itertools 
>>> ''.join(map(str, itertools.chain.from_iterable(zip(list1, list2)))) 
1one2two3three4four5five' 

Объяснение:

  • zip(list1, list2) создает список, содержащий кортежи совпадающих элементов из двух списков:

    >>> zip(list1, list2) 
    [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five')] 
    
  • itertools.chain.from_iterable() уплощается, что вложенный список:

    >>> list(chain.from_iterable(zip(list1, list2))) 
    [1, 'one', 2, 'two', 3, 'three', 4, 'four', 5, 'five'] 
    
  • Теперь мы должны убедиться, что есть только строки, поэтому мы применяем str() ко всем элементам с помощью map()

  • В конце концов ''.join(...) объединяет элементы списка в одну строку без сепаратора.
+0

Я бы сказал, что это самый гибкий пифонический ответ. Преимущество здесь заключается в том, что можно с радостью добавить больше итераций в 'zip()', и он будет работать отлично, остальные ответы потребуют изменения в зависимости от количества итераций. –

+1

@Lattyware гибкий, да, но определенно переборщик для этой конкретной ситуации – jamylak

+2

@Lattyware: для меня ответ Ашвини самый пифонический - «просто лучше, чем сложный», вы знаете. – georg

2

Использование string formatting с str.join() и zip():

>>> list1 = [1,2,3,4,5] 
>>> list2 = ["one", "two", "three", "four", "five"] 

>>> "".join("{0}{1}".format(x,y) for x,y in zip(list1,list2)) 
'1one2two3three4four5five' 

zip(list1,list2) возвращает что-то вроде этого: [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five')].

Теперь для каждого элемента этого списка мы применяем форматирование строки, а затем присоединяем все выражение генератора, используя str.join().

+0

или просто '' {} {} '. Format (* p) для p в ... ' – georg

+0

@ thg435 Таким образом, это яснее – jamylak

+0

@jamylak: Я не большой фанат' формата', поэтому я лично используйте ''% d% s "% p для p ...'. – georg

Смежные вопросы