Изменение элементов вложенных списков внутри цикла for - PullRequest
1 голос
/ 18 апреля 2020

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

items_q = [['Place1','a=2','b=3','c=4','z=5','d=4'],
           ['Place2','a=2','b=3','c=4','z=5','f=4'],
           ['Place3','a=2','r=3','s=6'],
           ['Place2','a=2','r=3','s=4','z=5'],
           ['Place3','a=2','z=3','d=4']]

Мне нужно извлечь две вещи. Один представляет собой список мест, а другой снимает количество с каждого элемента (буквы). Я получил так далеко:

places = []

for trx in items_q:
    places.append(trx[0])
    #print(trx[0])
    trx.pop(0)
    for i in trx:
        i = i[:-2]
        #print(i)

Это "почти" все, что мне нужно. Он создает список мест, но не меняет значения для каждой из буквенных строк (удаляя = x).

Вывод должен быть:

items_q = [['a','b','c','z','d'],
           ['a','b','c','z','f'],
           ['a','r','s'],
           ['a','r','s','z'],
           ['a','z','d']]

places = ['Place1', 'Place2', 'Place3', 'Place2', 'Place3']

Я понимаю, что проблема должна заключаться в том, что мы не можем изменить список напрямую / на месте. Нужно ли создавать новый список и добавлять значения? Я застрял.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 18 апреля 2020

Вам нужно выполнить итерацию в качестве индекса, не используя значения.

for trx in items_q:
    places.append(trx[0])
    trx.pop(0)
    for i in range(len(trx)): # i is now 0, 1, 2 … len(trx) - 1
        trx[i] = trx[i][:-2] # address the list using index

Я бы порекомендовал изменить последнюю строку на trx[i] = trx[i].split("=")[0], которая будет содержать имя элемента более одного символ (скажем, 'aa' не 'a')

1 голос
/ 18 апреля 2020

вы можете использовать:

places = []
items = []

for p, *i in items_q:
    places.append(p)
    items.append([e[0] for e in i])

print(items)
print(places)

# [['a', 'b', 'c', 'z', 'd'], ['a', 'b', 'c', 'z', 'f'], ['a', 'r', 's'], ['a', 'r', 's', 'z'], ['a', 'z', 'd']]
# ['Place1', 'Place2', 'Place3', 'Place2', 'Place3']

, если хотите сохранить элементы в переменной items_q:

items_q = items
1 голос
/ 18 апреля 2020

Используйте функцию перечисления для более точной адресации каждого индекса:

Всесторонне:

places = []

for trx in items_q:
    places.append(trx[0])
    trx.remove(trx[0]) #Works similarly to Pop but doesn't return removed item in console

    for (index, value) in enumerate(trx):
        trx[i] = value[:-2]

print(items_q)
print(places)

Это должно вернуть желаемый результат.

...