python批处理列表元素

2024-10-01 09:41:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个列表中列出了一系列的扑克牌。有4个玩家,所以列表中的每四个元素代表一个单一的技巧。我必须同时处理4张牌才能找到特技赢家。我需要一次将列表分成四个元素。我目前正在做以下工作:

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张卡吗?有谁能帮我让代码更像Python吗?在


Tags: 元素列表技巧indexdt玩家代表card
3条回答

通过显式地迭代四个组而不是逐个元素,可以使代码变得更好一些。有几种方法可以做到这一点。最简单的方法是将索引增加四:

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

这样做的好处是在index == 0时,不会像您的代码那样在空的four_card上调用处理代码。另外,我建议坚持一种命名约定(下划线vs CamelCase)。我选择前者,因为这是普遍推荐的Python约定。在

您可以使用^{} 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)
^{pr2}$

请记住,如果您的输入序列没有四个元素的倍数,grouper的这个实现将用None填充最后一组中的额外元素。它还假设您在每次迭代中使用组的所有元素(在本例中是这样做的)。有关其他实现,请参见this wonderful answer。在

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

如果要从列表中创建长度为4的列表,则可以使用以下方法:

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

相关问题 更多 >