python列表到字典的数据流

Posted

技术标签:

【中文标题】python列表到字典的数据流【英文标题】:python list to dictionary for dataflow 【发布时间】:2018-11-23 07:36:17 【问题描述】:

我正在尝试将 JSON 文件转换为字典并应用键/值对,因此我可以使用 groupbykey() 基本上对键/值对进行重复数据删除。

这是文件的原始内容:

"tax_pd":"200003","ein":"720378282" "tax_pd":"200012","ein":"274027765" "tax_pd":"200012","ein":"042746989" "tax_pd":"200012","ein":"205993971"

我已经这样格式化了:

(u'201208', u'010620100') (u'201208', u'860785769') (u'201208', u'371650138') (u'201208', u'237253410')

我想将这些转换为键/值对,以便在我的数据流管道中应用 GroupByKey。我想我需要先把它变成字典?

我是 python 和谷歌云应用程序的新手,如果有一些帮助会很棒!

编辑:代码 sn-ps

with beam.Pipeline(options=pipeline_options) as p: (p | 'ReadInputText' >> beam.io.ReadFromText(known_args.input) | 'YieldWords' >> beam.ParDo(ExtractWordsFn()) # | 'GroupByKey' >> beam.GroupByKey() | 'WriteInputText' >> beam.io.WriteToText(known_args.output))

class ExtractWordsFn(beam.DoFn): def process(self, element): words = re.findall(r'[0-9]+', element) yield tuple(words)

【问题讨论】:

看起来您已经在字典中找到了它。你可能想使用json.load 或类似的东西 似乎不清楚。如何从 200003 中得到 201208?你能指定你需要的精确格式吗? 我会在帖子中添加一些sn-ps的代码 示例sn-p中的数字不匹配,因为我没有给出匹配的值,对不起,假设这些数字是相同的。 【参考方案1】:

一个快速的纯 Python 解决方案是:

import json

with open('path/to/my/file.json','rb') as fh:
    lines = [json.loads(l) for l in fh.readlines()]

# ['tax_pd': '200003', 'ein': '720378282', 'tax_pd': '200012', 'ein': '274027765', 'tax_pd': '200012', 'ein': '042746989', 'tax_pd': '200012', 'ein': '205993971']

查看您的数据,您没有唯一的键来执行 tax_pdein 的 key:value。假设会发生碰撞,您可以执行以下操作:

myresults = 

for line in lines:
    # I'm assuming we want to use tax_pd as the key, and ein as the value, but this can be extended to other keys

    # This will return None if the tax_pd is not already found
    if not myresults.get(line.get('tax_pd')):
        myresults[line.get('tax_pd')] = [line.get('ein')]
    else:
        myresults[line.get('tax_pd')] = list(set([line.get('ein'), *myresults[line.get('tax_pd')]))

#results
#'200003': ['720378282'], '200012': ['205993971', '042746989', '274027765']

这样你就有了唯一的键,以及对应的唯一ein 值的列表。不完全确定这是否是你想要的。 set 会自动对一个列表进行去重,包装 list 会重新转换数据类型

然后您可以通过tax_id 显式查找:

myresults.get('200012')
# ['205993971', '042746989', '274027765']

编辑:要从云存储中读取,代码 sn-p here 翻译成更易于使用:

with gcs.open(filename) as fh:
    lines = fh.read().split('\n')

您可以使用他们的 api 文档设置您的 gcs 对象

【讨论】:

还有一个问题,在使用谷歌云存储桶中的文档时如何使用这种方法? 您可以像上面使用ExtractWords 所做的那样将其写入一个类。这似乎是您的 beam.Pipeline 方法的一部分。考虑到这一点,您可以以与 yield tuple(words) 相同的方式从类/函数中生成整个字典 我在代码中添加了谷歌云存储连接,该对象的设置在文档中。我添加.split('\n') 的原因是read() 返回整个文档的字符串表示形式。在换行符上拆分将为您提供所需的列表结构 @jmoore255 Accept the answer,拜托。

以上是关于python列表到字典的数据流的主要内容,如果未能解决你的问题,请参考以下文章

python下列哪些类型的数据可以放入到集合中 列表 字典 集合 整型 浮点型?

Python - 将字典列表附加到嵌套的默认字典时出现关键错误

python字典列表过滤器

python字典列表过滤器

python数据类型—列表元组字典

Python:字典列表列表[关闭]