2014-09-04 2 views
0

Я пытаюсь создать новый список («newList») из элементов существующего списка («буквенный список»). Подвоха есть новый список может начинаться в любом пункте в существующем списке, в зависимости от аргумента, переданного функции («firstLetter»):Python: Заполнение списка из другого списка

def makeNewList(firstLetter): 
    letterList=["A","B","C"] 
    newList=[] 

    # get index of argument (firstLetter) 
    for i in [i for i,x in enumerate(letterList) if x==firstLetter]: 
     index=i 

    # fill newList from cycling through letterList starting at index position 
    for j in range(10): 
     if index==3: 
      index=0 
     newList[j]=letterList[index] 
     index=index+1 

makeNewList («B»)

Я надеялся, что это даст мне новый список [«B», «C», «A», «B», «C», «A», «B», «C», «A»], но я получаю IndexError : индекс назначения списка вне диапазона , ссылающийся на эту строку: newList [j] = letterList [index]

ответ

1

Используйте функцию .append, чтобы добавить ее в конец списка.

def makeNewList(firstLetter): 
    letterList=["A","B","C"] 
    newList=[] 

    # get index of argument (firstLetter) 
    for i in [i for i,x in enumerate(letterList) if x==firstLetter]: 
     index=i 

    # fill newList from cycling through letterList starting at index position 
    for j in range(10): 
     if index==3: 
      index=0 
     newList.append(letterList[index]) 
     index=index+1 
    return newList 

print(makeNewList("B")) 
0

более вещий подход

from itertools import islice, cycle 
letterList=["A","B","C"] 
start=letterList.index('B') 
letterList = letterList[start:] + letterList[0:start] 
print list(islice(cycle(letterList), 10)) 
1

Вы не можете назначить по индексу индексу списка, который еще не существует:

>>> l = [] 
>>> l[0] = "foo" 

Traceback (most recent call last): 
    File "<pyshell#25>", line 1, in <module> 
    l[0] = "foo" 
IndexError: list assignment index out of range 

Вместо append до конца newList , Кроме того, вам нужно return результат:

def makeNewList(firstLetter): 
    letterList=["A","B","C"] 
    newList=[] 

    # get index of argument (firstLetter) 
    for i in [i for i,x in enumerate(letterList) if x==firstLetter]: 
     index=i 

    # fill newList from cycling through letterList starting at index position 
    for j in range(10): 
     if index==3: 
      index=0 
     newList.append(letterList[index]) # note here 
     index=index+1 

    return newList # and here 

Вот более Pythonic реализация:

def make_new_list(first_letter, len_=10, letters="ABC"): 
    new_list = [] 
    start = letters.index(first_letter) 
    for i in range(start, start+len_): 
     new_list.append(letters[i % len(letters)]) 
    return new_list 
Смежные вопросы