【问题标题】:How to merge all lists in a dictionary efficiently?如何有效地合并字典中的所有列表?
【发布时间】:2021-02-26 15:49:28
【问题描述】:

我有一本字典df2,其中每个值都是一个单词列表。然后我想将所有这些列表合并到df3。为此,我使用了一个循环,这需要超过 1 分钟才能完成。

import nltk
from nltk.corpus import twitter_samples
from nltk.tokenize import word_tokenize

df = twitter_samples.strings('tweets.20150430-223406.json')
df2 = {}
for i in range(len(df)):
    df2[i] = word_tokenize(df[i])

df3 = []
for i in df2:
    df3 = df3 + df2[i]

df3[0:5]

它返回['RT', '@', 'KirkKus', ':', 'Indirect']。能否请您提供一种更高效的方式来高效生成df3

【问题讨论】:

  • 您能告诉我们您使用此代码得到的输出吗?
  • 请向minimal reproducible example 提供示例输入和预期输出数据,以便我们更好地了解您在此处尝试执行的操作。此外,如果您的代码有效并且您只想改进它,还有 Code Review,但如果您在那里发帖,请阅读他们的规则和操作方法以确保您的问题与主题相关
  • @Saimon 我已经添加了输出。
  • 为什么不直接从word_tokenize() 的结果创建df3,而不是添加到字典然后然后添加到列表?除此之外,(并将其写成列表理解,本质上是语法糖)我看不到任何更有效的方法
  • @PranavHosangadi 这是因为df2是我练习中必需的数据框。

标签: python python-3.x list dictionary


【解决方案1】:

您可以使用列表推导。这应该会快一些(可能大约 1500 次,根据您的说明,它需要超过 1 分钟才能完成):

df3 = [v for lst in df2.values() for v in lst]

请让我们知道它如何在您的数据上进行时间比较。

在我的使用合成数据的系统上,组合 20K 个列表(每个列表包含 100 个单词)需要 35 毫秒,从而产生一个 200 万长的列表。相比之下,您的代码需要 53.5 秒(慢 1500 倍)。更糟糕的是:您编写的代码与n(结果列表的长度)呈超线性比例:重复创建列表的权重越来越大。事实上,根据经验,对于平均长度为km 列表,它似乎大致为O(k m^2)

最后的想法:我个人更希望有一个字数统计结果:

from collections import Counter

z = Counter([v for lst in df2.values() for v in lst])

您可以使用itertools.chain 让它更快一点:

from collections import Counter
from itertools import chain

z = Counter(chain.from_iterable(df2.values()))

合成设置示例:

import random

df2 = {i: random.choices(
    'the quick brown fox jumps over the lazy dog'.split(),
    k=100) for i in range(20000)}

这样,上面的计数器需要 140 毫秒并返回(示例):

>>> z
Counter({'over': 222301,
         'fox': 222208,
         'the': 445399,
         'lazy': 222688,
         'quick': 221598,
         'dog': 222322,
         'jumps': 221819,
         'brown': 221665})

【讨论】:

    【解决方案2】:

    由于df2 中的值是列表,您可以简单地编写以下更 Pythonic 的替代方案。

    
    df3 = []
    for value in df2.values():
        df3.extend(value)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多