Python - изменить значение элемента в списке

1

У меня есть некоторые данные, которые я закрепил вместе, используя itertools.zip_longest

import itertools
names = 'Tim Bob Julian Carmen Sofia Mike Kim Andre'.split()
locations = 'DE ES AUS NL BR US'.split()
confirmed = [False, True, True, False, True]
zipped_up = list(itertools.zip_longest(names, locations, confirmed))

если я распечатаю zipped_up так, как сейчас, я получаю следующее:

[('Tim', 'DE', False), ('Bob', 'ES', True), 
('Julian','AUS', True), ('Carmen', 'NL', False), 
('Sofia', 'BR',True), ('Mike', 'US', None), 
('Kim',None, None),('Andre', None, None)]

Это нормально, недостающим значениям присваивается значение "Нет" по умолчанию. Теперь я хочу изменить значения "Нет" на "-".

Похоже, я должен быть в состоянии сделать это в следующих вложенных циклах. Если в приведенном ниже коде я включаю оператор печати, все работает так, как я хотел:

for items in zipped_up:
    for thing in items:
        if thing == None:
            thing = '-'
        print(thing)

Но если я снова напечатаю zipped_up (вне циклов), значения "Нет" не изменились. Почему бы и нет? Это как-то связано с типом данных элементов списка, которые являются кортежами?

Я ссылался на некоторые другие потоки stackoverflow, включая этот, но не смог его использовать: поиск и замена элементов в списке (python)

  • 2
    «Почему нет? Это как-то связано с типом данных элементов списка, которые являются кортежами?» Нет, совсем нет. thing = '-' просто присваивает значение '-' к локальным переменным thing , и вы не должны ожидать , что это повлияет на список вы итерацию. Где-то определенно есть дубликаты, но я предлагаю вам прочитать nedbatchelder.com/text/names.html
  • 0
    Можете ли вы просто опубликовать оригинал до того, как отправили молнию и вашу цель, и, возможно, есть лучший способ
Показать ещё 5 комментариев
Теги:
python-3.x

2 ответа

4
Лучший ответ

Просто используйте аргумент fillvalue:

zipped_up = list(itertools.zip_longest(names, locations, confirmed, fillvalue='-'))

>>> zipped_up
[('Tim', 'DE', False), ('Bob', 'ES', True), ('Julian', 'AUS', True), ('Carmen', 'NL', False), ('Sofia', 'BR', True), ('Mike', 'US', '-'), ('Kim', '-', '-'), ('Andre', '-', '-')]
  • 1
    Важный аспект этого вопроса, вероятно, объясняет, почему попытка ОП не сработала
  • 0
    @ juanpa.arrivillaga, но можем ли мы сказать, почему иначе он использовал бы zip_longest zip если не использовал fillvalue ?
Показать ещё 2 комментария
3

Во-первых, вы пытаетесь изменить элементы в кортежах, но кортежи являются неизменяемыми объектами.
Единственный способ "изменить" их - создать новые на основе существующих.

Во-вторых, эта часть вашего кода

for thing in items:
    if thing == None:
        thing = '-'

заменяет только содержимое переменной thing, так что даже если бы вы изменяемые объекты в zipped_up списке - такие, как (вложенные) списки - ваш код не изменит их так или иначе.

Поэтому, если по какой-либо причине вы не хотите принимать решение sacul и вместо этого отредактируйте свой цикл в цикле, вы можете добавить вновь созданные кортежи в новый пустой список.

Как в этом (не очень приятном) коде:

result = []
for a, b, c in zipped_up:
    a = '-' if a is None else a
    b = '-' if b is None else b
    c = '-' if c is None else c
    result.append((a, b, c))

print(result)

Выход:

[('Tim', 'DE', False), ('Bob', 'ES', True), ('Julian', 'AUS', True), ('Carmen', 'NL', False), ( "София", "БР", "Правда") ("Майк", "США", "-"), ("Ким", "-", "-") ("Андре", "-", ")]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню