2017-09-26 61 views
1

对不起,我要问这个问题,如果它是一个相当容易的,因为时间有限这个script..I've已经这样写下面的一些代码:如何通过使用python将多个列表合并为多个字典?

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'] 

我想要得到的结果是dictio中naries像:

{'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)) 

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

+0

标签和属性*每行*是否保证是唯一的?换句话说,''attribute1''只会出现在line1吗? –

+0

发布您的'localNames'内容 – RomanPerekhrest

+0

这是个好问题。我认为标签应该是唯一的,但属性可能不是。 – Penny

回答

2
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']} 

如果你想dict有所有的标签在一个列表

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)) 
+0

谢谢你的答案 - 我可以问我如何使标签和属性列表像你的例子?现在我得到的印刷标签就像我在我的问题中展示的那样.. – Penny

+0

@Penny看到我的更新 – galaxyan

+0

Hi @galaxyan嗨,非常感谢!这是非常有前途的!我尝试了额外的请求代码,发现如果我打印属性,它会打印出几个单独的列表,最后一个列出所有内容,这就是我们需要/相同的例子。我试图弄清楚如何只打印出我们现在需要的那个... – Penny

1

如果您明确创建字典,则可以更轻松,更清晰地完成此操作。 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]) 
+0

谢谢你的答案 - 我可以问我怎么可以使标签和属性列表像你的例子?现在我得到的打印标签就像我在我的问题中展示的那样... – Penny

+0

在我的示例中,标签和属性存储在名为'dicts'的列表中。我会将其重命名为“dict_list”,以便更清晰。 –

+0

谢谢你的回答!我明天会读你的代码! – Penny

0

您可以通过应用嵌套maps实现这一目标:

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

我试过运行这个,它给了我'TypeError:()缺少1所需的位置参数:'x'' – Conic

+0

@Conic更新了答案。期待您对此解决方案的性能评估! –

+0

我试图仔细地将这个改为接受属性,标签并返回字典的函数。我注意到,我必须采取几个步骤才能显着改变性能评估。如果你不介意,你能找到一种方法将你的地图变成字典吗? – Conic

1

一个内胆:

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答案是1000000 loops1.05 µs per loop使用timeit模块

jeremy答案是1000000 loops1.21 µs使用timeit模块

guten_tag(THI S分析的)是在850 ns per loop1000000 loops使用timeit模块

其中µs10^-6nano10^-9

在一个非常肤浅的层面上,这会使您的性能提高2-3个数量级。

相关问题