从列表中按键生成字典列表

时间:2014-01-10 07:24:31

标签: python

我有一个清单:

['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技巧缩短它?

3 个答案:

答案 0 :(得分:5)

您可以使用简单的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会返回每个项目的第二个元素,结果如下所示输出。

答案 1 :(得分:2)

使用一个非常简单的for循环:

>>> l = ['8C', '2C', 'QC', '5C', '7C', '3C', '6D', 'TD', 'TH', 'AS', 
...  'QS', 'TS', 'JS', 'KS']
>>> my_dict = {}
>>> for x in l:
...     my_dict.setdefault(x[-1],[]).append(x)
... 
>>> my_dict
{'S': ['AS', 'QS', 'TS', 'JS', 'KS'], 'H': ['TH'], 'C': ['8C', '2C', 'QC', '5C', '7C', '3C'], 'D': ['6D', 'TD']}

答案 2 :(得分:2)

data = ['8C', '2C', 'QC', '5C', '7C', '3C', '6D', 'TD', 'TH', 'AS', 'QS',
        'TS', 'JS', 'KS']

dic = {}
for i in data:
    try:
        dic[i[1]].append(i)
    except:
        dic[i[1]] = []
        dic[i[1]].append(i)

print dic

输出

{'S': ['AS', 'QS', 'TS', 'JS', 'KS'],
 'H': ['TH'],
 'C': ['8C', '2C', 'QC', '5C', '7C', '3C'],
 'D': ['6D', 'TD']}