【问题标题】:python process list elements in batchespython 批量处理列表元素
【发布时间】:2017-07-15 00:23:04
【问题描述】:

我在一个列表中有一系列打出的牌。有 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张卡吗?谁能帮我让我的代码更 Pythonic?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

如果您想从列表中创建长度为 4 的列表,则可以这样做:

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

【讨论】:

  • 这已被 Python 3 标记,将 xrange 更改为 range
  • 谢谢,会的。我没注意标签。
  • 谢谢,它有帮助。 :)
【解决方案2】:
offset = 4
index = 0
while index < len(YourList):
       result = YourList[index:index+offset]
       index += offset

【讨论】:

  • 这绝对比在for 循环中使用range 更少Pythonic,但可能仍然比OP 的原始解决方案更好。
【解决方案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 约定。

您可以使用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

【讨论】:

    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2019-08-22
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多