python进程批量元素列表

时间:2017-07-14 14:36:58

标签: python python-3.x

我在列表中有一系列已打牌。共有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吗?

3 个答案:

答案 0 :(得分:4)

如果要从列表中创建长度为4的列表,可以实现这一目的:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

您可以使用itertools documentation提供的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的此实现将使用SELECT Tid, CASE WHEN MinVal = 0 THEN 0 WHEN Neg % 2 = 1 THEN -1 * EXP(ABSMult) ELSE EXP(ABSMult) END FROM ( SELECT Tid, SUM(LOG(ABS(NULLIF(value, 0)))) AS ABSMult, SUM(SIGN(CASE WHEN value < 0 THEN 1 ELSE 0 END)) AS Neg, MIN(ABS(value)) AS MinVal FROM t GROUP BY Tid ) t2 填充最后一个组中的额外元素。它还假设您在每次迭代中使用该组的所有元素(在本例中您将这样做)。有关替代实施,请参阅this wonderful answer