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