如果一个键符合某些内容,则删除dict的更多pythonic方法

时间:2017-01-13 15:55:06

标签: python python-3.x dictionary

我有以下格式的词典列表:

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}
]

7 个答案:

答案 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问题。 pandasPyData套件的一部分(我认为),并且被广泛接受。我会用它来解决这类问题。

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)