2013-05-03 2 views
3

У меня есть два кортежаСлияние двух кортежей в один

("string1","string2","string3","string4","string5","string6","string7") 

и

("another string1","another string2",3,None,"another string5",6,7) 

Я хотел бы сделать что-то вроде этого:

("string1another string1","string2another string2","string33","string4","string5another string5","string66","string77"). 

Было бы также хорошо с результат:

("string1another string1","string2another string2","string33","string4None","string5another string5","string66","string77") 

Но так как я новичок в Python, я не уверен, как это сделать. Каков наилучший способ комбинирования двух кортежей?

ответ

3

Используйте zip и выражение генератора:

>>> t1=("string1","string2","string3","string4","string5","string6","string7") 
>>> t2=("another string1","another string2",3,None,"another string5",6,7) 

Первый ожидается выход:

>>> tuple("{0}{1}".format(x if x is not None else "" , 
          y if y is not None else "") for x,y in zip(t1,t2)) 
('string1another string1', 'string2another string2', 'string33', 'string4', 'string5another string5', 'string66', 'string77') 

Второй ожидаемый выход:

>>> tuple("{0}{1}".format(x,y) for x,y in zip(t1,t2)) #tuple comverts LC to tuple 
('string1another string1', 'string2another string2', 'string33', 'string4None', 'string5another string5', 'string66', 'string77') 

Используйте этот ternary expression для обработки None значения:

>>> x = "foo" 
>>> x if x is not None else "" 
'foo' 
>>> x = None 
>>> x if x is not None else "" 
'' 
+0

+1, но ... почему ты прохождение listcomp в 'кортеж 'вместо выражения генератора? Это немного усложняет чтение (больше парнеров/скобок/и т. Д., Чтобы отслеживать), и в больших объемах отнимает память, а преимущество производительности 2.x в крошечных случаях почти никогда не будет иметь значения. – abarnert

+0

@abarnert, вы поняли, что производительность - единственная причина, по которой я иногда предпочитаю понимание списка вместо выражения генератора. Это плохая привычка, которую я выбрал из соревнований по программированию, в которых важна производительность. –

+0

Не может быть: x, если x else ""? – dansalmo

1

Try зип функция как

>>> a = ("string1","string2","string3","string4","string5","string6","string7") 
>>> b = ("another string1","another string2",3,None,"another string5",6,7) 
>>> [str(x)+str(y) for x,y in zip(a,b)] 
['string1another string1', 'string2another string2', 'string33', 'string4None', 'string5another string5', 'string66', 'string77'] 

Если вы хотите, чтобы результат кортежа, вы могли бы сделать так:

>>> tuple([str(x)+str(y) for x,y in zip(a,b)]) 
('string1another string1', 'string2another string2', 'string33', 'string4None', 'string5another string5', 'string66', 'string77') 
+0

Это почти правильно, но '' string4 "+ None' является' TypeError', а не '' string4None''. (И если вы это исправите, то как это отличается от более раннего ответа Ашвини Чаудхари?) – abarnert

+0

@abarnert Извините, что «string4None» в порядке. И я использовал функцию str(), прежде чем присоединять две части. Поэтому он должен работать хорошо. – Sheng

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