2017-07-14 79 views
1

我在列表中有玩過的卡片序列。有4名選手,因此列表中的每個元素都代表一個技巧。我必須共同處理4張牌才能找到絕招。我需要一次拆分四個元素。我目前正在做以下事情:批處理python進程列表元素

cardSequnce = [ 
    'D7', 'D8', 'DT', 'DA', 
    'H2', 'H7', 'HK', 'H5', 
    'H3', 'HT', 'HA', 'HQ', 
    'H8', 'D2', 'H4', 'HJ', 
    'D6', 'D3' 
] 
four_card = [] 
for index, card in enumerate(cardSequnce): 
    if(index % 4 == 0): 
     # process four_card 
     four_card = [] 
    four_card.append(card) 

我認爲我可以做得比使用python更強大。我可以一起訪問4張卡片嗎?任何人都可以幫助我使我的代碼更加Pythonic?

+0

嘗試['itertools'](https://docs.python.org/3/library/itertools.html#itertools-recipes)中的'grouper'配方。 –

+0

可能重複[什麼是最「pythonic」的方式來遍歷一個列表在塊?](https://stackoverflow.com/questions/434287/what-is-the-most-pythonic-way-to-iterate -over-a-list-in-chunk) –

回答

2

如果你想從列表中創建長度爲4的名單,這將這樣的伎倆:

[cardSequence[i:i + 4] for i in range(0, len(cardSequence), 4)] 
+1

這已被標記爲Python 3,將'xrange'更改爲'range'。 –

+0

謝謝,會做。我沒有注意標籤。 – Hannu

+0

謝謝,它有幫助。 :) –

1
offset = 4 
index = 0 
while index < len(YourList): 
     result = YourList[index:index+offset] 
     index += offset 
+0

這比在'for'循環中使用'range'明顯少得多,但可能比OP的原始解決方案更好。 –

+0

是的,我同意你的意見 – pooya

0

您可以通過四種代替組明確迭代使你的代碼更好一點元素的元素。有幾種方法可以做到這一點。最簡單的也只是由四個遞增指數:

card_sequence = ... 
for index in range(0, len(cardSequence), 4): 
    four_card = card_sequence[index:index + 4] 
    # process four_card 

這有沒有要求對空four_cardindex == 0加工代碼的優勢,因爲你的代碼一樣。另外,我會建議堅持一個命名約定(下劃線與CamelCase)。我選擇了前者,因爲這是一般推薦的Python慣例。

您可以使用itertools documentation提供的grouper配方做一個稍微複雜的版本。這種方法的優點是,它可能會變得更好:

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return zip_longest(*args, fillvalue=fillvalue) 
card_sequence = ... 
for four_card in grouper(card_sequence, 4): 
    four_card = list(four_card) 
    # Process four_card 

記住,這個實現的grouper將佔據最後一組額外的元素與None如果輸入序列沒有四個元素的倍數。它還假定您在每次迭代中都使用該組中的所有元素(在這種情況下您將執行此操作)。有關其他實現,請參見this wonderful answer