У меня есть некоторые данные, которые я закрепил вместе, используя 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)
Просто используйте аргумент 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', '-', '-')]
zip_longest
zip
если не использовал fillvalue
?
Во-первых, вы пытаетесь изменить элементы в кортежах, но кортежи являются неизменяемыми объектами.
Единственный способ "изменить" их - создать новые на основе существующих.
Во-вторых, эта часть вашего кода
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), ( "София", "БР", "Правда") ("Майк", "США", "-"), ("Ким", "-", "-") ("Андре", "-", ")]
thing = '-'
просто присваивает значение'-'
к локальным переменнымthing
, и вы не должны ожидать , что это повлияет на список вы итерацию. Где-то определенно есть дубликаты, но я предлагаю вам прочитать nedbatchelder.com/text/names.html