从Python字典中提取Counter信息

时间:2014-10-09 11:21:39

标签: python dictionary counter

我有一个类似的字典:

myDict.items()

('RI.16498.172.249.dcm',
  '~/pythonTests/20130206162339/1CW/20-03-13'),
('RI.134.45.dcm',
  '~/pythonTests/20130206162339/2CCW/18-02-13'),
 ('RI.16671.160.134.dcm',
  '~/pythonTests/20130206162339/1CW/20-02-13')]
.....

表示文件及其位置。有共享该位置的文件,我需要能够提取该信息。例如,我想知道日期"1CW"上有多少文件属于"20-03-13"(参见我字典的第一个元素)

我尝试过Counter

 counts = Counter((k[1], v) for k, v in myDict.items())
 counts
 Counter({('I', '~/pythonTests/20130206162339/1CW/20-02-13'): 47, ('I', '~/pythonTests/1.2.246.352.71.5.22453062.437221.20130206162339/1CW/18-02-13'): 52, ......

但我仍然看不到我可以查询我想要的信息的方式。知道如何做到这一点吗?

我的目标是获得给定日期(20-03-13)和字段(1CW或2CCW)的出现次数:

Num = getValues("1CW","20-03-13")

2 个答案:

答案 0 :(得分:2)

a = [i.split('/') for i in d.itervalues()]
c = [i.count('1CW') for i in a if i[4] == '20-02-12']    

这将实际上是你想要的。

s = []
    for i in d.itervalues():
        s.append(i.split('/'))
    print s
    for i in s:
        if i[4] == '20-02-13':
            print i.count('1CW')

最简单的方法。

答案 1 :(得分:1)

如果您的目标只是获取每个路径出现的次数,那么您必须

counts = Counter(v for k, v in myDict.items())

正如您在此处所看到的,您没有正确使用'for'命令;当您使用'for'迭代字典上的项时,第一个变量(在本例中为'k')对应于字典中的键(在您的示例中为文件名),而第二个变量('v' ')对应于值(文件的路径)。在你的代码中,你正在做k [1]这不是你想要的,因为它只是取文件名上的第二个字符,把k作为一个字符数组,这就是为什么你得到这个奇怪在Counter对象上'我'字符。

通过将for循环的结果更改为仅值('v'),您将初始化Counter以对路径而不是名称进行操作。

编辑:正如您所说,您的目标是拥有一个取决于日期和前缀的功能,我建议您使用以下解决方案:

def compute(dict, prefix, date):
    counts = Counter((v.split('/')[3], v.split('/')[4]) for v in dict.values()])
    return counts.get((prefix, date))

请注意元组周围的括号;如果你不放它们,Counter的构造函数会认为这是两个不同的参数而不是元组。

之后,您只需要使用相应的参数调用该函数:

res = compute(myDict, "1CW", "20-03-13")