首页 > 解决方案 > python字典分配错误的键

问题描述

我正在使用 python docx 从 word 文档表中提取测试,我正在循环多个 docx 文件。数据以字典列表的形式出现。我遇到的问题是字典列表已将一些键分配为值,将一些值分配为键。我正在尝试找到一种重新分配键和值的方法

这是当前字典的示例:

[
  {'Title': 'Purpose', 'Analysis of Data ':'To analyze data'},
  {'Title': 'test data', 'Analysis of Data ':'To analyze data'}
] 

逗号前面的两个字符串应该是键,逗号后面的两个字符串应该是值

那么我可以如何重新排列这些字典列表,使它们看起来像下图?

[
  {'Title': 'Analysis of Data ', 'Purpose': 'To analyze data'},
  {'Title': 'test data', 'Purpose': 'To analyze data'}
]

代码(根据评论调整):

data_t = []
def getTable(filename): 
    document = Document(filename)
    table = document.tables[0]
    keys = None
    for i, row in enumerate(table.rows): 
        text = (cell.text for cell in row.cells) 
        if i == 0: 
            keys = tuple(text) 
            continue 
        row_data = dict(zip(keys, text)) 
        data_t.append(row_data) 

path = (r'C:\Users\OyooP\Desktop\auto1*.docx')
files=glob.glob(path) 
table_list = [] 
for f in files: 
    tbl_corpus = getTable(f) 
    table_list.append(tbl_corpus) 

corpus_list[0] 
data_t 

标签: pythonlistdictionarydocx

解决方案


正如所评论的,最好从源头解决这个问题。

但无论如何,这可能有助于“重新安排”:

基本上我们有:input = {'A': 'B', 'C':'D'}

我们想要:output = {'A':'C', 'B':'D'}

dicts.items()中有一个属性:

返回字典中的键值对列表。

所以我们可以这样做:

    Given: 
    d = {'A': 'B', 'C':'D'}

    >> list(d.items())
    >> [('A', 'B'), ('C','D')]

    So we could do something like:

    >> list(d.items())[0][1]
    >> 'C'

有了这个我们可以检索任何键或值,所以现在我们可以尝试重新排列它。

所以我概括了 .items() 部分并用这种方法重新排列它:

def arrange_dict(input):
    for i in range(len(input)):
        for j in range(len(input)):
            if j == len(input):
                break
            value = list(input.items())[i][j]
            if i != j:
                if i < j:
                    new_key = value
                    next_val = list(input.items())[i+1][j]
                    input.update({new_key:next_val})
                else:
                    input.pop(value)
                    new_val = value
                    prev_key = list(input.items())[i-1][j]
                    input.update({prev_key:new_val})

现在您可以像这样安排列表中的每个字典:

    for dict in list:
        arrange_dict(dict)

希望它有所帮助,如果有人可以重构它,请随时发布;)


推荐阅读