假设我有一个以元组为键的字典,如下所示:
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)])
,但它只返回一个值,是否有一种简单的方法可以做到这一点?
提前致谢。
答案 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]