Что не так с моим кодом здесь (Python, Lists, Strings)? - PullRequest
0 голосов
/ 21 февраля 2019

Я перебираю список «a» длиной x, где, если столбец 1 имеет более одного разрыва строки, я хочу скопировать всю строку x и реплицировать ее, но столбец 1 содержит уникальное значение.

Например, если у меня есть строка, а в столбце 1 содержатся значения (A, B, C), я хочу скопировать все остальные данные, и он должен содержать только 1 значение в столбце 1.

steps = []
temp = a[x]
if a[x][1].count('\n') == 0:
    steps.append(temp)

else:
    split = a[x][1].split('\n')
    count = a[x][1].count('\n')+1
    for b in range(0, count):
        temp[1] = split[b]
        steps.append(temp)

Предполагаемый результат списка «шагов»:

xxx, A, yyy, zzz
xxx, B, yyy, zzz
xxx, C, yyy, zzz

Фактический результат:

xxx, C, yyy, zzz
xxx, C, yyy, zzz
xxx, C, yyy, zzz

Ответы [ 2 ]

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

Это потому, что списки Python являются изменяемыми и вы всегда изменяете один и тот же список.

Когда вы делаете:

steps.append(temp)

В каждой итерации вы добавляететот же список (temp) к списку результатов steps.Как и в каждой итерации, вы изменяете второй элемент списка temp при выполнении

temp[1] = split[b]

В списке steps результата будет каждый из его элементов (как они есть).все те же элементы) изменено.

Иллюстрировано:

Шаг 1

b = 0
split[b] = A
temp[1] = split[b] -> temp = "xxx, A, yyy, zzz"
steps = [temp] === ["xxx, A, yyy, zzz"]

Шаг 2

b = 1
split[b] = B
temp[1] = split[b] -> temp = "xxx, B, yyy, zzz"
steps = [temp, temp] === ["xxx, B, yyy, zzz", "xxx, B, yyy, zzz"]

Шаг 3

b = 2
split[b] = C
temp[1] = split[b] -> temp = "xxx, C, yyy, zzz"
steps = [temp, temp, temp] === ["xxx, C, yyy, zzz", "xxx, C, yyy, zzz", "xxx, C, yyy, zzz"]
0 голосов
/ 21 февраля 2019

Этот вопрос очень трудно понять, потому что вы не определили a или x.

Тем не менее, проблема почти наверняка в том, что вы каждый раз модифицируете и добавляете один и тот же temp dict,Вам необходимо скопировать его:

    new_temp = temp.copy()
    new_temp[1] = split[b]
    steps.append(new_temp)
...