Список Python: странное поведение при разбивке словарного поля - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть данные, хранящиеся в следующем формате:

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()

Этот код производит эквивалент:

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

Почему это не работает?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Добавляя один и тот же dict row в каждой итерации к ids и обновляя ключ id до того же самого dict, вы перезаписываете значение ключа id в предыдущих итерациях.

Вместо этого вы должны добавить новую копию диктанта из row.Поскольку вы собираетесь обновить ключ id, вы можете сначала pop нажать его, а затем использовать универсальную распаковку для обновления его значения:

for id in row.pop('id').split(';'):
    combined_file_array.append({**row, 'id': id})
0 голосов
/ 23 февраля 2019

Вы изменяете один и тот же словарь, поэтому в итоге вы меняете идентификатор для обеих ваших строк.

Делая

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

, вы изменяете не только combined_file_array[-1]['id'], но и combined_file_array[-2]['id'], потому что они оба указывают на один и тот же диктант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...