我有以下格式的词典列表:
list = [
{'name':'bob','age':12},
{'name':'jill','age':34}
]
我想删除name
等于某个值的第一个字典。有没有更好的方法呢?
value = 'bob'
for dict in list:
if dict['name'] == value:
list.remove(dict)
break
输出:
list = [
{'name':'jill','age':34}
]
答案 0 :(得分:1)
list1 = [
{'name':'bob','age':12},
{'name':'jill','age':34}
]
value = 'bob'
for i, item in enumerate(list1):
if item['name'] == value:
list1.pop(i)
break
答案 1 :(得分:1)
这是一个完美的pandas
问题。 pandas
是PyData
套件的一部分(我认为),并且被广泛接受。我会用它来解决这类问题。
Python 3.5.2 |Anaconda custom (x86_64)| (default, Jul 2 2016, 17:52:12)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> query_list = [ {'name':'bob','age':12}, {'name':'jill','age':34} ]
>>> DF = pd.DataFrame(query_list)
>>> DF
age name
0 12 bob
1 34 jill
>>> mask = DF["name"] != "bob"
>>> mask
0 False
1 True
Name: name, dtype: bool
>>> DF2 = DF.loc[mask,:]
>>> DF2
age name
1 34 jill
>>> DF2.to_dict()
{'age': {1: 34}, 'name': {1: 'jill'}}
答案 2 :(得分:1)
如果你想要一个衬垫,你可以使用next()
的生成器表达式,一旦找到要删除的第一个项目就会短路,然后使用list.remove()
:
l.remove(next(d for d in l if d['name'] == value))
示例:
>>> l = [{'name':'bob','age':12},{'name':'jill','age':34}]
>>> value = 'bob'
>>> l.remove(next(d for d in l if d['name'] == value))
>>> l
[{'name': 'jill', 'age': 34}]
注意这会引发StopIteration
value
找不到next()
,这可以避免,但它会更长一些,因为尽管list.remove()
有一个默认参数,{{1}没有:
>>> l = [{'name':'bob','age':12},{'name':'jill','age':34}]
>>> value = 'bob'
>>> value_to_remove = next((d for d in l if d['name'] == value), None)
>>> 'Value not in list' if value_to_remove is None else l.remove(value_to_remove)
>>> l
[{'name': 'jill', 'age': 34}]
>>> value_to_remove = next((d for d in l if d['name'] == value), None)
>>> 'Value not in list' if value_to_remove is None else l.remove(value_to_remove)
'Value not in list'
答案 3 :(得分:0)
来自python的字典文档。
https://docs.python.org/3/library/stdtypes.html#dict
d.clear()将清除字典的所有值。
value = 'bob'
for dict in list:
if dict['name'] == value:
#Empty dictionary of all values, will now return {}
dict.clear()
break
如果字典在其他人的列表中,您只需将其从列表中弹出或删除即可。
list2 = [x for x in list1 if x != {}]
答案 4 :(得分:0)
在我看来,使用filter
是最pythonic的方式:
new_list = filter(lambda x: x['name'] != value, original_list)
但是,这不会从原始列表中删除并在内存中创建一个新列表。分配old_list = filter(...)
模仿从原始模式中删除(至少在本地范围内)但是仍然存在内存开销。对于小名单(和大多数情况),这不会发挥作用。如果确实如此,那么以下可能更合适:
for item in original_list:
if item['name'] == value:
original_list.remove(item)
break
答案 5 :(得分:0)
我会创建一个单独的实用程序函数来执行此操作。下面首先确定哪些(如果有的话)词典符合标准,然后 With Me '<--| reference your userform
For x = 1 To 6
.Controls("txtBoard" & x).Caption = rst(0)
If Not rst(0) = "" Then
boardPresent(x) = True
End If
.Controls("txtBoardSer" & x).Caption = rst(1)
rst.MoveNext
Next
End With
s(删除)找到的第一个词典。
pop
答案 6 :(得分:0)
list1 = [
{'name': 'bob', 'age':12},
{'name': 'jill', 'age':34}
]
map(lambda d: d.pop('name', 0) if d['name'] == 'bob' else d, list1)