什么是python相当于ruby的收集

时间:2015-01-25 09:54:28

标签: python

在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(新语言)中做同样的事情,但没有成功。

2 个答案:

答案 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]