2017-07-30 242 views
0

我是Python新手,需要一個循環列表。我有5個標籤的列表:如何從Python中的列表創建一個循環列表?

taglist = ["faint", "shocking", "frosty", "loved", "sadness"] 

我還有一個清單,單調遞增值:

list = [1,2,3,4,5,6,7] 

我想創建一個由list長度使用taglist另一個列表。如果list有7個項目,我想要一個像下面這樣的標籤的新列表。

newtaglist = ["faint", "shocking", "frosty", "loved", "sadness","faint", "shocking"] 

而這個列表將繼續像圓​​形填充那樣。我怎樣才能做到這一點?

解決方案:謝謝所有在這篇文章中回答的人。現在我很困惑選擇答案。 :(大家似乎不錯。雖然我使用一個簡單的一個。

回答

2

newtaglist可以使用模運算符,以確保該指數是在範圍

taglist = ["faint", "shocking", "frosty", "loved", "sadness"] 
num_list = [1,2,3,4,5,6,7] 
newtaglist = [taglist[i % len(taglist)] for i in xrange(len(num_list))] 

屈服產生:

[ '微弱', '令人震驚', '冷淡',「喜愛」, '悲傷', '昏', '震驚']

運行它here

+1

我已經使用這種方法。 –

+1

如果您關心運行時,這實際上是最慢的方法,比所有其他方法[在我鏈接的例子中非常相似](https://repl.it/JpkQ)慢大約10倍。 – Jedi

+1

感謝來自repl的代碼...!所以,stemod使用divmod是最快的。 –

3

此外,在蟒蛇list是內置的功能,不使用list變量名。

taglist = ["faint", "shocking", "frosty", "loved", "sadness"] 
print(len(taglist)) 
list_ = [1,2,3,4,5,6,7] 
print(len(list_)) 

diff = len(list_) - len(taglist) 

for i in range(0, diff): 
    taglist.append(taglist[i]) 
print(taglist) 
+0

雖然它不是問題,如果他想要在列表中循環多次,這會失敗。我認爲在循環之前添加一個'tag_length = len(taglist)',然後'taglist.append(taglist [i%tag_length])'可能會解決這個問題。雖然沒有測試過。 **編輯**這樣的事情,但我認爲這是通過名單錯誤的方向... – Engineero

+0

@mtkilic感謝指出「名單」之一。:) –

10

最簡單的方法是使用itertools.cycle這是專爲這一特定目的

>>> from itertools import cycle, islice 
>>> baselist = [1,2,3,4,5,6,7] 
>>> taglist = ["faint", "shocking", "frosty", "loved", "sadness"] 
>>> list(islice(cycle(taglist), len(baselist))) 
['faint', 'shocking', 'frosty', 'loved', 'sadness', 'faint', 'shocking'] 

另一種方式是乘(重複)列表,使其足夠大,然後切片,任何多餘的:

>>> baselist = [1,2,3,4,5,6,7] 
>>> taglist = ["faint", "shocking", "frosty", "loved", "sadness"] 
>>> n = len(baselist) 
>>> (taglist * -(n // -len(taglist)))[:n] 
['faint', 'shocking', 'frosty', 'loved', 'sadness', 'faint', 'shocking'] 

雙重否定用於將地板分區轉換爲天花板分區,只要有餘數就會舍入。這可以確保列表乘法總是能夠根據需要提供至少同樣多的元素。

+0

使用乘法方法對我來說似乎很好,這是學習新事物的新方式。 –

2

其中n是所需的長度:

[taglist[i % len(taglist)] for i in range(n)] 

或者你可以使用的

from itertools import cycle 
infiniteTagList = cycle(taglist) 
[next(infiniteTagList) for i in range(n)] 
2

雷蒙德的建議倍增加切片:

>>> taglist = ['a', 'b', 'c', 'd', 'e'] 
>>> length = 13 
>>> 
>>> q, r = divmod(length, len(taglist)) 
>>> taglist * q + taglist[:r] 
['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c']