根据基于该字典中另一个键的值的条件,更新python中字典列表中的值

时间:2017-01-04 13:22:54

标签: python list dictionary

给出一个词典列表:

$isPut= Request::isMethod('put');

if($isPut) {
  //
}

如何根据基于the_list = [{k1:v1,k2:v2}, {k1:v3, k3:v4}, {k1:v5,k2:v6},{k3:v7}] 的值的条件更新k2的值?

我会想出这个解决方案,但感觉不到Pythonic。更好的解决方案吗?

k1

使用map或lambda表达式可能可以做得更好吗?

2 个答案:

答案 0 :(得分:2)

这是我提出的执行相同操作的最简单的代码:

my_list = [{k1:v1,k2:v2}, {k1:v3, k3:v4}, {k1:v5,k2:v6},{k3:v7}]
for my_dict in my_list:
    if all (k in my_dict for k in ("k1", "k2")):
        if cond(my_dict[k1]):
            my_dict[k2] = newvalue # possibly pre-determined 

根据cond评估生成k1和/或newvalue的值的方式,代码可能会更加“Python化”。

答案 1 :(得分:0)

好吧在python dir(dict)中显示了我们可用的字典方法,dir(dict)中的“somemethod”向我们展示了sed数据类型中是否有某些方法可用。因此,如果我们将其考虑在我们的问题中,我们可以将其列入:

py.2.7->

['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__',\
 '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',\
 '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__',\
 '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__',\
 '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems',\
 'iterkeys', 'itervalues','keys', 'pop', 'popitem', 'setdefault', 'update', 'values', \
'viewitems', 'viewkeys', 'viewvalues']

py.3.5 - >

['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__',\
 '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',\
 '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__',\
 '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__',\
 '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems',\
 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values',\
 'viewitems', 'viewkeys', 'viewvalues']

现在我们可以在这里看到几件事,poppopitemhas_key,'get',因为python中的字典没有排序或排序(它打印出来就像它一样我们也可以使用update

首先,我们需要横向通过字典列表和条件项,取决于字典映射的大小或字典理解可以做的技巧或只是dict.items()返回元组列表。 所以

def duDict(dictionary,codnitionElement,keyInQuesiton):
    el = dictionary.pop(keyInQuesiton) #similar as list.pop
    if condition(dictionary.get(codnitionElement)):
       el = something
       dictionary.update({keyInQuesiton:el })
    else:pass
    return dictionary

然后就行了

condDict = lambda dict: duDict(dict,predefinedCondition,forKey)
map( condDict , listOfDicts )

希望这有帮助