在ruby中,您可以这样做从哈希中收集重要值:
hash = {'a'=> {'consider_this' => 1, 'dont_consider_this' => 4},
'b' => {'consider_this' => 4, 'dont_consider_this' => 4}}
hash.collect{|key, value| value['consider_this']}=> [1, 4]
=> [1, 4]
试图在python(新语言)中做同样的事情,但没有成功。
答案 0 :(得分:6)
对字典的值使用list comprehension:
nested = {
'a': {'consider_this': 1, 'dont_consider_this': 4},
'b': {'consider_this': 1, 'dont_consider_this': 4}
}
[v['consider_this'] for v in nested.values()]
外部词典中的键不重要。输出为[1, 1]
,consider_this
键的所有值,按任意顺序排列。另请参阅dict.values()
method。如果缺少consider_this
密钥,则认为是错误。
您可以使用过滤来仅考虑具有特定键的词典:
nested = {
'a': {'consider_this': 1, 'dont_consider_this': 4},
'b': {'consider_this': 2, 'dont_consider_this': 4},
'c': {'dont_consider_this': 4},
}
[v['consider_this'] for v in nested.values() if 'consider_this' in v]
# outputs [1, 2] or [2, 1]
或提供默认值:
nested = {
'a': {'consider_this': 1, 'dont_consider_this': 4},
'b': {'consider_this': 2, 'dont_consider_this': 4},
'c': {'dont_consider_this': 4},
}
[v.get('consider_this', 0) for v in nested.values()]
# [1, 2, 0], or alternative orders
后者使用dict.get()
method。
考虑使用{...}
(集合理解)而不是列表来反映排序在这里并不重要;结果只会包含唯一值,因此{1}
如果所有consider_this
键只有值1
。
答案 1 :(得分:0)
python(语言新)
中收集值
在ruby中,您可以执行此操作以从哈希hash.collect{|key, value| value['consider_this']}
什么是python等同于ruby的收集
python中的等价物是:
d = {
'a': {'consider_this': 1, 'dont_consider_this': 'a'},
'b': {'consider_this': 4, 'dont_consider_this': 'b'},
'c': {'hello': 2}
}
results = []
for key, val in d.items():
x = val.get('consider_this', False)
results.append(x)
print results
--output:--
[1, False, 4]
当您获得更多经验时,您可以学习如何使用所谓的list comprehensions
更有效地从循环创建列表:
results = [
val.get('consider_this', False)
for key, val in d.items()
]
print results
--output:--
[1, False, 4]
请注意,在python中,您可以使用d.values()
代替d.items()
,因为您不使用密钥:
results = [
val.get('consider_this', False)
for val in d.values()
]
print results
--output:--
[1, False, 4]
在ruby 1.9+中,哈希是有序的,但在python词典中没有排序,所以如果结果的顺序对你很重要,你可以使用python' s OrderedDict:
import collections as coll
d = coll.OrderedDict(
[
('a', coll.OrderedDict([('consider_this', 1), ('dont_consider_this', 'a')])),
('b', coll.OrderedDict([('consider_this', 4), ('dont_consider_this', 'b')])),
('c', coll.OrderedDict([('hello', 2)]))
]
)
results = [
val.get('consider_this', False)
for key, val in d.items()
]
print results
--output:--
[1, 4, False]