无法理解Python中的itertools.groupby()

时间:2014-05-22 18:05:57

标签: python itertools

您好,感谢您查看我的问题!我已阅读有关python的文档和itertools.groupby( ) in python的最高评价问题。但是我仍然对这个功能如何运作感到困惑。有人可以引导我完成for rank, group in groupby (hand , lambda card: card [1])次迭代吗?特别是lambda card: card[1]部分。从我的理解,它只是返回卡[1]但卡没有变量。此外,对于rank, group,是因为手的每个索引有2个值,例如第一张牌是' 3S'因此它的值有3和S?如果将每个手的指数改为3个值,是否需要第三个变量?例如。 ' 3SH&#39 ;?对不起,如果这似乎是一个已经回答的问题,即使用简单的话,我也无法理解......

hand = ['3S', '3D', '3H', '4D']

sorted_hand_by_suit = []
for rank, group in groupby (hand , lambda card: card [1]):
    sorted_hand_by_suit.append(list(group))
return sorted_hand_by_suit

print sorted_hand_by_suit # [['3S'],['3D', '4D'], [3H]]

2 个答案:

答案 0 :(得分:0)

您可以将其重新编写为

what_to_group = hand
def how_to_group(an_item):
   return an_item[1] 

grouped_objects = groupby(what_to_group,how_to_group)
sorted_hand = []
for object in grouped_objects:
    rank = object[0]
    group = list(object[1])
    sorted_hand.append(group)

我不确定这是否有助于你弄清楚是什么意思......

表示这样做要好得多。

sorted_hand_by_suite = sorted(hand,key=lambda card:reversed(card))

(虽然它并没有做同样的事情......)

答案 1 :(得分:0)

您的示例需要一些更正。在这里,我对其进行了重构:

给出

hand = ["3S", "3D", "3H", "4D"]

pred = lambda x: x[1]
iterable = sorted(hand, key=pred)

代码

[list(grp) for key, grp in groupby(iterable, key=pred)]
# [['3D', '4D'], ['3H'], ['3S']]

详细信息

要了解这一点,请先打印键的结果:

[key for key, grp in it.groupby(iterable, key=pred)]
# ['D', 'H', 'S']

请注意,这些键与前一个答案中的组相关。

groupby对象的键由接受功能的key参数定义。 lambda函数pred = lambda x: x[1]等效于以下常规函数:

def pred(x):
    return x[1]

因此,随着手的每张牌迭代,每个字符串的索引1被指定为组的键。换句话说,如果下一个卡'3D',则D成为组的密钥。所有在索引D包含1连续卡将被添加到组中。

另请参阅this post,有关如何使用Python的itertools.groupby()