列出dict中tuple键的所有值

时间:2015-12-30 13:22:09

标签: python dictionary

假设我有一个以元组为键的字典,如下所示:

d1 = {}
d1[(111,1)] = "value1111"
d1[(111,2)] = "value1112"
d1[(111,3)] = "value1113"
d1[(112,1)] = "value1121"
d1[(112,2)] = "value1122"
d1[(112,3)] = "value1123"

如何在元组键的第一个元素中获取给定数字的所有值?也就是说,对于111,我想获得以下内容:

value1111
value1112
value1113

我已经尝试了print(d1[(111,i)]),但它只返回一个值,是否有一种简单的方法可以做到这一点?

提前致谢。

4 个答案:

答案 0 :(得分:9)

使用列表理解,这样:

SELECT ParameterName, MAX(param_Value), MIN(param_Value) 
FROM MONITORING_PARAMETER_VALUES 
GROUP BY ParameterName

select @@rowcount

条件[v for k,v in d1.items() if k[0]==111] 表示仅返回其键的第一个元素为if k[0]==111

d1

您也尝试使用111,如果您可以控制键元组的第二个元素的范围和类型,那将会起作用,即:

print(d1[(111,i)]

在您的示例中,我们知道>>> [d1[(111,i)] for i in range(1,4)] ['value1111', 'value1112', 'value1113'] 只能是1到3,因此i,但如果您不知道{{1}的范围是什么1}}甚至是range(1,4)的类型,那么列表理解就是你最好的朋友。

当然,通过这样做,可以获得第一个元素为i的键元组的第二个元素列表:

i

答案 1 :(得分:7)

一个简单的列表理解就可以解决问题:

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

对于字典中的每个键>>> [d1[tup] for tup in d1 if tup[0] == 111] ['value1112', 'value1113', 'value1111'] ,如果键的第一个元素是111&#34;,请给我相应的值。

答案 2 :(得分:2)

如果您控制dict的创建方式并希望按元组的第一个元素进行分组,请忘记使用元组作为键,并使用附加到列表的defaultdict来处理重复的键:

from collections import defaultdict
d1 = defaultdict(list)
d1[111].append("value1111")
d1[111].append( "value1112")
d1[111].append("value1113")
d1[112].append("value1121")
d1[112].append("value1122")
d1[112].apendd("value1123")

然后您可以一次获取所有值或索引列表以获取第i个值:

In [17]: d1

Out[17]: 
defaultdict(list,
            {111: ['value1111', 'value1112', 'value1113'],
             112: ['value1121', 'value1122']})
In [18]: d1[111]
Out[18]: ['value1111', 'value1112', 'value1113']

In [19]: d1[111][0]
Out[19]: 'value1111'

In [20]: d1[111][1]
Out[20]: 'value1112'

答案 3 :(得分:0)

老实说,我认为默认的dict方法是最灵活的,允许您轻松查询其他值(例如112或113)。在下面的代码中,d2将是从111,112,113到各自值的映射。

d2 = defaultdict(list)
for key, value in d1.iteritems():
    d2[key[0]].append(value)

print d2[111]
print d2[112]