Python列表:分解字典字段时的奇怪行为

时间:2019-02-23 04:04:55

标签: python list

我以以下格式存储数据:

doc, err := xmlquery.Parse(strings.NewReader(s))
    if err != nil {
        panic(err)
    }
    for _, n := range xmlquery.Find(doc, "//GetPriceChangesForReseller/*") {
        fmt.Printf("%s price: %s\n", n.Data, n.SelectElement("EndUserPrice").InnerText())
    }

我想将其转换为:

name    address    id
person   place     A123
person2  place2    A345
person3  place3    A445;A456
person4  place4    A333

我正在尝试这样做:

name    address    id
person   place     A123
person2  place2    A345
person3  place3    A445
person3  place3    A456
person4  place4    A333

此代码产生的等同于:

    combined_file_array = []
    for index, row in enumerate(data):
        if (';' not in row['id']):
            combined_file_array.append(row)
        else:
            ids = row['id'].split(';')
            for id in ids:
                combined_file_array.append(row)
                combined_file_array[-1]['id'] = id.strip()

这为什么不起作用?

2 个答案:

答案 0 :(得分:0)

您要对同一个字典进行变异,因此最终要更改两行的ID。

这样做

combined_file_array[-1]['id'] = id.strip()

您不仅要更改combined_file_array[-1]['id'],而且要更改combined_file_array[-2]['id'],因为它们都指向同一个字典。

答案 1 :(得分:0)

通过在row上的每次迭代中附加相同的字典ids,并将id键更新为相同的dict,您将覆盖id键的值。以前的迭代。

您应该改为从row追加字典的新副本。由于您要更新id键,因此可以先pop,然后使用通用拆包更新其值:

for id in row.pop('id').split(';'):
    combined_file_array.append({**row, 'id': id})