【问题标题】:How to combine more than one list into more than one dicts by using python?如何使用 python 将多个列表组合成多个字典?
【发布时间】:2017-09-26 15:54:09
【问题描述】:

很抱歉,我不得不问这个问题是否是一个相当简单的问题,因为这个脚本的时间有限..我已经写了一些代码,如下所示:

localNames = re.findall(r"<\*\[local-name\(\)='.*?'.*?\/@\*\[name\(\)='.*?'.*?'\]", str(nontransTagsContent[0]))
for i in localNames:
tags = re.findall(r"local-name\(\)='(.*?)'", i)
attributes = re.findall(r"name\(\)='(.*?)'", i)

print(tags) 的结果如下:

['tag1']
['tag2', 'tag3', 'tag4']
['tag5', 'tag6']

print(attributes) 的结果如下:

['attribute1', 'attribute2', 'attribute3', 'attribute4']
['attribute5', 'attribute6']
['attribute7', 'attribute8', 'attribute9']

我想要得到的结果是这样的字典:

{'tag1':['attribute1', 'attribute2', 'attribute3','attribute4'}
{'tag2':['attribute5', 'attribute6']}
{'tag3':['attribute5', 'attribute6']}
{'tag4':['attribute5', 'attribute6']}
{'tag5':['attribute7', 'attribute8', 'attribute9']}
{'tag6':['attribute7', 'attribute8', 'attribute9']}

我想通过这种方式,我可以轻松地操作数据,因为我可以提取数据并将它们写入其他形式。下面是我试过的代码:

for x in tags:
    dict = zip(tags, attributes)
    print (list(dict))

但输出似乎不正确。你能帮忙看看它,看看如何解决这个问题...非常感谢!

【问题讨论】:

  • 每行的标签和属性是否保证唯一?换句话说,'attribute1' 只会出现在 line1 吗?
  • 发布您的localNames 内容
  • 这是个好问题。我认为标签应该是唯一的,但属性可能不是。
  • 嗨@RomanPerekhrest 我添加了代码

标签: python dictionary attributes tags


【解决方案1】:
tags=[ 
    ['tag1'],
    ['tag2', 'tag3', 'tag4'],
    ['tag5', 'tag6'],
  ]

  attributes=[
              ['attribute1', 'attribute2', 'attribute3', 'attribute4'],
              ['attribute5', 'attribute6'],
              ['attribute7', 'attribute8', 'attribute9'],
            ]

  for idx, tag_line in enumerate(tags):
    for tag in tag_line:
      print {tag : attributes[idx]}

输出:

{'tag1': ['attribute1', 'attribute2', 'attribute3', 'attribute4']}
{'tag2': ['attribute5', 'attribute6']}
{'tag3': ['attribute5', 'attribute6']}
{'tag4': ['attribute5', 'attribute6']}
{'tag5': ['attribute7', 'attribute8', 'attribute9']}
{'tag6': ['attribute7', 'attribute8', 'attribute9']}

如果你想让字典在一个列表中包含所有标签

  from itertools import repeat
  for tag, attr in zip(tags,attributes):
    print dict(zip(tag, repeat(attr,len(tag))))

输出:

{'tag1': ['attribute1', 'attribute2', 'attribute3', 'attribute4']}
{'tag4': ['attribute5', 'attribute6'], 'tag2': ['attribute5', 'attribute6'], 'tag3': ['attribute5', 'attribute6']}
{'tag5': ['attribute7', 'attribute8', 'attribute9'], 'tag6': ['attribute7', 'attribute8', 'attribute9']}

其他要求:

tags, attributes = [], []
for i in localNames:
  tags.append(re.findall(r"local-name\(\)='(.*?)'", i))
  attributes.append(re.findall(r"name\(\)='(.*?)'", i))

【讨论】:

  • 感谢您的回答-请问如何使标签和属性成为像您的示例一样的列表?现在我得到的打印标签就像我在我的问题中显示的一样..
  • 嗨@galaxyan,非常感谢!这是非常有前途的!我尝试了其他请求代码,发现如果我打印属性,它会打印出几个单独的列表,最后一个打印出所有内容,这就是我们需要的/与您的示例相同。我试图弄清楚如何只打印出我们现在需要的那个......
  • 对不起我的错!我找到了得到这个结果的原因。请忽略我的最后一条消息。
  • 现在效果很好!谢谢!!到时候我会将此标记为答案。但是我明天会尝试阅读/理解代码,因为现在有点晚了,如果我有任何问题,明天可以回复你吗?
  • @Penny 当然,告诉我
【解决方案2】:

如果您明确地创建字典,您可以更轻松、更清楚地做到这一点。 zip 不创建字典。

tags = [
    ['tag1'],
    ['tag2', 'tag3', 'tag4'],
    ['tag5', 'tag6']
]

attributes = [
    ['attribute1', 'attribute2', 'attribute3', 'attribute4'],
    ['attribute5', 'attribute6'],
    ['attribute7', 'attribute8', 'attribute9']
]

dict_list = []
for t_list, a_list in zip(tags, attributes):
    for t in t_list:
        dict_list.append({t: a_list})
        print(dict_list[-1])

【讨论】:

  • 感谢您的回答-请问如何使标签和属性列表像您的示例一样?现在我得到的打印标签就像我在我的问题中显示的一样......
  • 在我的示例中,标签和属性存储在名为dicts 的列表中。我将把它重命名为dict_list,这样更清楚。
【解决方案3】:

一个班轮:

guten_tag = { tag: attributes[i] for i, tag_group in enumerate(tags) for tag in tag_group}

确保您有一个名为tags 的列表和一个名为attributes 的列表,就像在其他示例中一样。

tags = [
    ['tag1'],
    ['tag2', 'tag3', 'tag4'],
    ['tag5', 'tag6']
]

attributes = [
    ['attribute1', 'attribute2', 'attribute3', 'attribute4'],
    ['attribute5', 'attribute6'],
    ['attribute7', 'attribute8', 'attribute9']
]  

速度对比:

galaxy_an 答案是1.05 µs per loop 1000000 loops 使用timeit 模块

jeremy 答案是1.21 µs 1000000 loops 使用timeit 模块

guten_tag(这个方法)是850 ns per loop 1000000 loops 使用timeitmodule

其中µs10 ^ -6nano10 ^ -9

在非常肤浅的层面上,这会给您带来 2-3 个数量级的性能提升。

【讨论】:

    【解决方案4】:

    您可以通过应用嵌套的maps 来实现这一点:

    map(
        lambda x: map(
            lambda y: {y: attributes[x[0]]},
            x[1]
        ), 
        enumerate(tags)
    ) 
    

    【讨论】:

    • 我试过运行它,它给了我TypeError: &lt;lambda&gt;() missing 1 required positional argument: 'x'
    • @Conic 更新了答案。期待您对此解决方案的性能评估!
    • 我试图将其重新表述为一个接受属性、标签并返回字典的函数。我注意到我必须采取几个步骤可能会显着改变性能估计。如果您不介意,您能找到将地图变成字典的方法吗?
    • @Conic 它不应该输出单个字典,而是应该输出字典列表,正如 OP 所要求的那样。如果您担心 Python 3 中的 maplist,那么只需将其转换为 list。如果您尝试输出单个 dict,那么您可能误解了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2012-05-20
    • 1970-01-01
    • 2018-11-14
    相关资源
    最近更新 更多