【问题标题】:Building a dictionary of words from multiple lists in python在python中从多个列表中构建单词字典
【发布时间】:2013-03-19 20:01:50
【问题描述】:

我有一个100分的字典列表如下:

datapoint1 a:1 b:2 c:6
datapoint2 a:2 d:8 p:10
.....
datapoint100: c:9 d:1 z:12

我想将列表打印到文件中,如下所示:

           a b c d ...... z
datapoint1 1 2 6 0 ...... 0
datapoint2 2 0 0 8 ...... 0
.........
.........
datapoint100 0 0 9 1 ...... 12

这里提到a,b,c...z只是举例实际字数是事先不知道的,所以总字数不是26个,可以是1000/ 10000个,a,b, ....将被替换为真实的单词,如“我的”、“嗨”、“手提包”......等等。

我一直在考虑尝试如下:

  1. 构建一个单词字典,我们称之为全局字典
  2. 然后构建一个字典列表,其中每个字典代表一个数据点
  3. 然后尝试将字典列表映射到全局字典

但是这种方法在python中似乎很复杂。在python中有没有更好的方法?

【问题讨论】:

  • Pandas DataFrame 可能会有所帮助。
  • 如果你有 10,000 个单词,你将如何打印 10,000 列? (这听起来可能很挑剔,但由于您似乎只想重新格式化以包含每个数据点的所有列,因此您如何表示这是一个重要的问题,恕我直言。)

标签: python dictionary count frequency


【解决方案1】:

如果您不太关心列对齐的繁琐位,这还不错:

datapoints = [{'a': 1, 'b': 2, 'c': 6},
              {'a': 2, 'd': 8, 'p': 10},
              {'c': 9, 'd': 1, 'z': 12}]

# get all the keys ever seen
keys = sorted(set.union(*(set(dp) for dp in datapoints)))

with open("outfile.txt", "wb") as fp:
    # write the header
    fp.write("{}\n".format(' '.join([" "] + keys)))
    # loop over each point, getting the values in order (or 0 if they're absent)
    for i, datapoint in enumerate(datapoints):
        out = '{} {}\n'.format(i, ' '.join(str(datapoint.get(k, 0)) for k in keys))
        fp.write(out)

生产

  a b c d p z
0 1 2 6 0 0 0
1 2 0 0 8 10 0
2 0 0 9 1 0 12

正如 cmets 中提到的,pandas 解决方案也很不错:

>>> import pandas as pd
>>> df = pd.DataFrame(datapoints).fillna(0).astype(int)
>>> df
   a  b  c  d   p   z
0  1  2  6  0   0   0
1  2  0  0  8  10   0
2  0  0  9  1   0  12
>>> df.to_csv("outfile_pd.csv", sep=" ")
>>> !cat outfile_pd.csv
 a b c d p z
0 1 2 6 0 0 0
1 2 0 0 8 10 0
2 0 0 9 1 0 12

如果你真的需要很好地对齐列,那么也有办法做到这一点,但我从不需要它们,所以我对它们了解不多。

【讨论】:

  • 您可以使用'col {0:5} | col {1:5}'.format(1, 2) 使每一列的宽度相同(通过在短于{id:width}的部分添加空格)。
【解决方案2】:

计划:

data_points = [
    {'a': 1, 'b': 2, 'c': 6},
    {'a': 2, 'd': 8, 'p': 10},
    {'c': 9, 'd': 1, 'z': 12},
    {'e': 3, 'f': 6, 'g': 3}
]

merged_data_points = {
}

for data_point in data_points:
    for k, v in data_point.items():
        if k not in merged_data_points:
            merged_data_points[k] = []
        merged_data_points[k].append(v)

# print the merged datapoints
print '{'
for k in merged_data_points:
    print '  {0}: {1},'.format(k, merged_data_points[k])
print '}'

输出:

{
  a: [1, 2],
  c: [6, 9],
  b: [2],
  e: [3],
  d: [8, 1],
  g: [3],
  f: [6],
  p: [10],
  z: [12],
}

【讨论】:

  • 我还有一个问题。有没有更好的方法从打印数据中删除特定列?例如:我有上面的打印输出@ Morgan Wilde。我想通过键值删除 'c' 和 'd' 列。
  • @tom10 你正确地指出了问题。我在阅读 10000 列文件时遇到困难。我想把它输入另一个程序并做一些预处理。我用python编写了程序来读取这个4GB的文件并尝试进行预处理,以便减少列数。有什么简单的方法吗?
  • 在我的解决方案中,输出中的“列”只是merged_data_points 字典中的一个键。如果您想删除一列,只需忽略字典中的该键即可。
猜你喜欢
  • 2015-09-25
  • 2020-04-28
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 2021-08-21
  • 2017-04-27
相关资源
最近更新 更多