[英]Update a value in a list of dictionaries in python based on a condition based on the value of another key in that dictionary
給定詞典列表:
the_list = [{k1:v1,k2:v2}, {k1:v3, k3:v4}, {k1:v5,k2:v6},{k3:v7}]
如何基於基於k1
的條件更新k2
的值?
我會想出這個解決方案,但感覺不像Pythonic。 更好的解決方案嗎?
for item in the_list:
if set([k1,k2]) <= item.keys():
#cond evaluates to True or False
if cond(item[k1]):
item.update({k2:newvalue})
也許使用map或lambda表達式可以做得更好?
這是我想到的用於執行相同操作的最簡單的代碼:
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化”。
在python中,dir(dict)向我們展示了字典的可用方法,而在dir(dict)中向我們展示了sed數據類型中是否可以使用somemethod。 因此,如果我們將其納入我們的問題中,我們可以在以下方面找到答案:
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']
現在,我們可以在這里看到幾件事情, pop
, popitem
, has_key
,“得到”,而且由於詞典在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 )
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.