我有一个清单:
['8C', '2C', 'QC', '5C', '7C', '3C', '6D', 'TD', 'TH', 'AS', 'QS', 'TS', 'JS', 'KS']
我需要得到这样的字典:(排序并不重要)
{'C': ['QC', '8C', '7C', '5C', '3C', '2C'], 'S': ['AS', 'KS', 'QS', 'JS', 'TS'] }
码:
def parse_flush(cards): cards = sort_by_color(cards) flush_dic = {} print str(cards) count = 0 pos = 0 last_index = 0 for color in colors: for i, card in enumerate(cards): if card[1] == color: count += 1 last_index = i+1 if count == 1: pos = i if count >= 5: flush_dic[color] = sort_high_to_low(cards[pos:last_index]) count = 0 return flush_dic
我的代码现在看起来像,它的工作但我不喜欢它的长度可以使用python技巧缩短它?
您可以使用simple collections.defaultdict
来获得所需的结果
from collections import defaultdict result = defaultdict(list) for item in data: result[item[1]].append(item) print result
产量
{'S': ['AS', 'QS', 'TS', 'JS', 'KS'], 'H': ['TH'], 'C': ['8C', '2C', 'QC', '5C', '7C', '3C'], 'D': ['6D', 'TD']}
您也可以使用itertools.groupby
它来解决这个问题
data = ['8C', '2C', 'QC', '5C', '7C', '3C', '6D', 'TD', 'TH', 'AS', 'QS', 'TS', 'JS', 'KS'] from itertools import groupby from operator import itemgetter keyFn = itemgetter(1) print {k:list(grp) for k, grp in groupby(sorted(data, key = keyFn), keyFn)}
说明
sorted
返回已排序的项目列表,keyFn
用于排序数据.
groupby
接受一个排序列表,并根据它对项目进行分组keyFn
,在这种情况下,keyFn
返回每个项目的第二个元素,结果如输出中所示.