【问题标题】:How to write this list comprehension correctly?如何正确编写此列表理解?
【发布时间】:2020-04-02 14:44:50
【问题描述】:

我正在尝试编写一个列表理解,以整理出不重复的字典。我正在使用的数据如下所示:

[
    {
        'username': 'food_lovers_mad',
        'data': (some unique data)
    },
    {
        'username': 'oceanarmor',
        'data': (some unique data)
    },
    {
        'username': 'freediverlife',
        'data': (some unique data)
    }
]

我正在整理具有相同用户名的词典并将它们添加到新列表中。这是我目前的做法:

duplicates = [dup for outer in array for dup in
              [inner for inner in array
               if outer['username'] == inner['username']]]

编辑:输入的一个例子可能是:

[
    {
        'username': 'duplicate',
        'data': {
            "watches": 1241,
            "followers": 71234
        }
    },
    {
        'username': 'duplicate',
        'data': {
            "watches": 12431,
            "followers": 151
        }
    },
    {
        'username': 'not duplicate',
        'data': {
            "watches": 2124,
            "followers": 54124
        }
    }
]

这会产生输出:

[
    {
        'username': 'duplicate',
        'data': {
            "watches": 1241,
            "followers": 71234
        }
    },
    {
        'username': 'not duplicate',
        'data': {
            "watches": 2124,
            "followers": 54124
        }
    }
]

我真的很困惑,因为我对 python 中的列表理解有点陌生,所以我将不胜感激!

【问题讨论】:

  • 设置自动删除重复项。 uniques = list(set(original_list))
  • 你能举一个重复的例子和相同的预期输出吗?
  • 你能提供预期的输出吗?
  • 看看itertools.groupby。您当前的方法需要 O(n**2) 时间;排序和分组只需要 O(n lg n) 时间。
  • @JohnGordon 每个字典中提供的数据都是唯一的,所以这行不通?

标签: python python-3.x dictionary list-comprehension


【解决方案1】:

您可以使用集合来识别重复项:

seen = set()
duplicates = [d for d in array if d["username"] in seen or seen.add(d["username"])]

【讨论】:

  • in seen or seen.add(d["username"]) 不要在列表推导中使用副作用和小技巧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多