【问题标题】:Removing dictionary from list of dictionaries on element从元素上的字典列表中删除字典
【发布时间】:2016-05-06 11:29:23
【问题描述】:

我创建了一个列表,其中包含由不同对象填充的字典:变量、pandas Series 甚至 pandas DataFrames。该列表基本上包含有关打开的单个事务的日志。

如果满足某些条件(datetime.now() 超过 transaction_close_time),我想从该列表中删除交易。我尝试在循环中这样做:

for transaction in transactions:
    if condition is True:
        result = do_sth_with(transaction)
        transactions.remove(transaction)

但由于它包含 pandas 对象,所以我臭名昭著:

File "iterator.py", line 13, in close_trades
transactions.remove(trade)
File "/.../anaconda2/lib/python2.7/site-packages/pandas/core/generic.py", line 731, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如果我没记错的话,remove 方法正在尝试将 Series 相互比较并且失败,因此出现错误。 (令人惊讶的是,虽然每次 python 尝试删除 dict 时都不会出现错误,但仅在某些情况下......)

现在我正在考虑是否有更好的方法从列表中删除这些字典。每个字典都有它的唯一 id 作为它的元素之一,但我不确定如何从该元素的列表中删除它。

【问题讨论】:

  • @PrezemyslawRobertWilk 您能否发布一个示例,说明您的列表尤其是交易的外观?
  • 我只是一个列表 transactions = [transaction1, transaction2, transaction3, ...],trancationx 是包含大约 20 个不同元素变量、系列和数据帧的字典。

标签: python list dictionary pandas


【解决方案1】:

我想我已经找到了解决方案,这要归功于(我不知道为什么我之前没有找到那个话题):

Python: remove dictionary from list

反正我做的是:

for transaction in transactions:
    if condition is True:
        result = do_sth_with(transaction)
        transactions[:] = [d for d in transactions if d.get('trans_id') != transaction['trans_id']]

到目前为止效果很好,我认为甚至比 list.remove() 方法更快。

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 2020-07-14
    • 1970-01-01
    • 2021-10-31
    • 2019-06-04
    • 1970-01-01
    • 2023-01-12
    • 2022-11-27
    相关资源
    最近更新 更多