Как выполнить итерацию по списку строк разной длины?

#python #string #list

#python #строка #Список

Вопрос:

Предположим, у меня есть

lists = ["ABC","AC","CCCC","BC"]

Я хочу новый список, в котором элементы в моем новом списке сгруппированы по позициям на основе lists значения для каждой строки в списке, занимают позицию 0 (позиция «ABC» 0 равна «A») и создают из нее строку.

position = ["AACB","BCCC","CC","C"]

Я пытаюсь:

for i in range(0,4):
want = [lists[i] for stuff in lists]

и я получаю

IndexError: string index out of range

Что имеет смысл, потому что все строки имеют разный размер. Кто-нибудь может помочь?

Комментарии:

1. Ваш вопрос не имеет никакого смысла. Пожалуйста, уточните это, чтобы я мог помочь.

2. Я понятия не имею, что вы пытаетесь сделать, но ошибка, которую вы получаете, вызвана попыткой доступа к спискам [2] (третий элемент) в списке из 2 элементов.

3. Я предполагаю, что если у вас была третья строка BC, ваш ожидаемый результат [«AAB», «BBC», «C»]?

4. Для чего нужен желаемый результат ["ABC","AC","BCD"] ?

5. Разве вывод не должен быть ['AA', 'BC', 'C'] ?

Ответ №1:

Я думаю, вам может понадобиться это:

 import itertools
lists = ["ABC","AC","CCCC","BC"]
position = map(''.join,itertools.izip_longest(*lists, fillvalue=''))
  

и вы получаете:

 ['AACB', 'BCCC', 'CC', 'C']
  

редактировать: теперь с новым примером…

Комментарии:

1. То, что хочет OP, и то, что он говорит, что хочет, иногда две разные вещи.

2. есть ли более простой способ сделать это без itertools?

3. @user2801122 способ смотреть дареному коню в зубы. Почему бы не сделать свою собственную попытку? Например, вы могли try бы для каждого ввода выполнять итерации и pass далее IndexError .

Ответ №2:

Вы можете использовать это понимание списка:

 >>> lists = ["ABC","AC","CCCC","BC"]
>>> [''.join([s[i:i 1] for s in lists]) for i, el in enumerate(lists)]
['AACB', 'BCCC', 'CC', 'C']
  

Использование нотации среза предотвращает ошибки индексации для несуществующих элементов.