Почему Python добавляет символы новой строки в некоторые элементы списка? - PullRequest
0 голосов
/ 31 мая 2019

Я читаю файлы из текстового файла с именем WeaponShack.list

Это содержимое 'gun shack.list':

Grenade
Ak-47
Shotgun
Makarov
Minigun
Bat
Katana
Chainsaw
Flamethrower

Пробелов нет. Эти элементы скопированы как есть.

Я пытаюсь сократить некоторые символы новой строки, но символ "\ n" просто появляется на некоторых элементах, когда я печатаю список. Я не понимаю почему.

Я пытался использовать .strip ('\ n'), но символы "\ n" по-прежнему всплывали в конце некоторые элементы.

print("Taking weapons from Weapon shack")
weapons = []
with open("WeaponShack.list",'r') as ws:
    weapons = ws.readlines()
    for weapon in weapons:
        weapons.remove(weapon)
        weapon = weapon.strip('\n')
        weapons.append(weapon)
ws.close()
print(weapons)

Ожидаемый результат:

Взятие оружия из оружейной лачуги [«Ак-47», «Макаров», «Летучая мышь», «Бензопила», «Граната», «Миниган», «Огнемет», «Катана», «Дробовик»]

Но фактический результат:

Взятие оружия из оружейной хижины ['Ак-47 \ n', 'Макаров \ n', 'Летучая мышь \ n', 'Бензопила \ n', 'Граната', 'Миниган,' Огнемет ',' Катана ',' Дробовик ']

Кто-нибудь знает, почему это происходит?

EDIT Мой фокус заключается в том, почему появляется символ «\ n». Не как пройти через списки. Также попробуйте предложение: adding a new list:

print("Taking weapons from Weapon shack")
weapons = []
newWeaponList = []
with open("WeaponShack.list",'r') as ws:
    weapons = ws.readlines()
    for weapon in weapons:
        weapons.remove(weapon)
        weapon = weapon.strip('\n')
        newWeaponList.append(weapon)
ws.close()
print(newWeaponList)

производит этот вывод:

Взятие оружия из оружейной хижины [«Граната», «Дробовик», «Миниган», «Катана», «Огнемет»]

Странно, потому что он не показывает все элементы.

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Это потому, что вы одновременно читаете и изменяете список, предотвращая обход каждого элемента.weapon.strip('\n')

Для оружия с '\ n' в конце никогда не достигается *1001* Чтобы очистить его, устраните проблему обхода и избавьтесь от новых пробелов, попробуйте что-то вроде этого ответ:

print("Taking weapons from Weapon shack")
with open("weapons.list") as ws:
    readWeapons = ws.readlines()
    for weapon in readWeapons:
        weapon = weapon.rstrip('\n')
        weapons.append(weapon)
print(weapons)

Редактировать:

Чтобы ответить на ваше пояснение, это из-за того, как работает цикл for в python.Я не знаком с точными деталями, но похоже, что цикл for фактически обращается к массиву в режиме реального времени, а не читает весь массив сразу.Проверьте это чтение из test.list, который содержит четыре строки, соответствующие AD:

print("Taking item from test\n")
with open("test.list",'r') as ws:
    elements = ws.readlines()
    print(elements)
    print()
    for element in elements:
        print('Current element: ' + element)
        elements.remove(element)
        print('Element pre-strip: ' + str(elements))
        element = element.strip('\n')
        print('Stripped element: ' + element)
        elements.append(element)
        print('Element list post-strip: ' + str(elements))

Вывод:

Taking item from test

['A\n', 'B\n', 'C\n', 'D\n']

Current element: A

Element pre-strip: ['B\n', 'C\n', 'D\n']
Stripped element: A
Element list post-strip: ['B\n', 'C\n', 'D\n', 'A']
Current element: C

Element pre-strip: ['B\n', 'D\n', 'A']
Stripped element: C
Element list post-strip: ['B\n', 'D\n', 'A', 'C']
Current element: A
Element pre-strip: ['B\n', 'D\n', 'C']
Stripped element: A
Element list post-strip: ['B\n', 'D\n', 'C', 'A']
Current element: A
Element pre-strip: ['B\n', 'D\n', 'C']
Stripped element: A
Element list post-strip: ['B\n', 'D\n', 'C', 'A']

Из-за добавления, а не добавления, каждый другой элемент находится в процессепропускается при перемещении цикла for из индекса a массива в индекс a + 1 массива.Это приводит к тому, что B и D (индексы 1 и 3) пропускаются, а A читается 3 раза.

1 голос
/ 31 мая 2019

@ rdas Спасибо за вашу помощь.

» Удаление элементов из списка во время итерации по нему портит относительный порядок элементов в списке. Поскольку вы перебираете список только один раз, некоторые элементы могут быть пропущены. Так что \ n не появляется - просто никогда не удаляется из некоторых элементов. "

Я удалил строку weapons.remove(weapon), и она исправила ее!

Ура!

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