如何使用python将多个列表组合成多个dicts?

时间:2017-09-26 15:54:10

标签: python dictionary attributes tags

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

+AwesomeApp
+---AwesomeApp.WebApp
+---AwesomeApp.Services
+---AwesomeApp.WebApp.Tests
    +----AwesomeApp.WebApp.Tests.Unit
        +----UnitTest #1
        +----UnitTest #2
    +----AwesomeApp.WebApp.Tests.Integration
        +----IntegrationTest #1
        +----IntegrationTest #2
    +----AwesomeApp.WebApp.Tests.Regression
        +----RegressionTest #1
        +----RegressionTest #1

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

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

4 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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])

答案 2 :(得分: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使用1.05 µs per loop模块在​​1000000 loops timeit处回答jeremy

1.21 µs使用1000000 loops模块在​​timeit guten_tag处回答850 ns per loop

1000000 loops(此方法)timeit µs使用10 ^ -6模块

其中nano10 ^ -9cv::Mat mat(image.height(),image.width()+750, CV_8UC3,image.bits(), image.bytesPerLine()); QImage your_image; your_image.load(":/Sombrero.png"); your_image = your_image.convertToFormat( QImage::Format_RGBA8888, Qt::ThresholdDither|Qt::AutoColor); cv::Mat mat_im(your_image.height(),your_image.width(),CV_8UC3,your_image.bits(), your_image.bytesPerLine());

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

答案 3 :(得分:0)

您可以通过应用嵌套的maps

来实现此目的
map(
    lambda x: map(
        lambda y: {y: attributes[x[0]]},
        x[1]
    ), 
    enumerate(tags)
)