LINUX.ORG.RU

Удалять из списка в цикле

 


0

2

Есть класс:

class Pathes:
	
	archiveDir = '/mnt/Arch/'
	localArchivesFake = ['current', 'test']
	
	def localArchiveDirs():
		
		localArchivesRaw = os.listdir(Pathes.archiveDir)
		localArchives = []
		
		for localArchiveFake in Pathes.localArchivesFake:
			localArchivesRaw.remove(localArchiveFake)
		
		for localArchiveRaw in localArchivesRaw:
			if os.path.isfile(Pathes.archiveDir + localArchiveRaw + '/last/dirname'):
				localArchives.append(localArchiveRaw)
		
		return localArchive

Но возникает ошибка:

# ./archives_parser.py
Traceback (most recent call last):
  File "./archives_parser.py", line 48, in <module>
    Pathes.localArchiveDirs()
  File "./archives_parser.py", line 35, in localArchiveDirs
    localArchiveRaw.remove(localArchiveFake)
ValueError: list.remove(x): x not in list

Почему ошибка, почему удаление localArchiveFake из списка не работает?

Deleted

Потому что в списке нет такого итема?

zz ★★★★
()

Потому что элемента в списке нет. А с чего вы взяли, что он там появится?

BattleCoder ★★★★★
()
Ответ на: комментарий от Deleted

Ну тут только один человек, который знает что он листдирит.

zz ★★★★
()
Ответ на: комментарий от Deleted

Важно понимать, что вызов os.listdir - это побочные эффекты. Этот метод всегда может вернуть что угодно, как пустой список, так и список из 9000 элементов - ваша программа должна быть к такому готова.

А вы же почему-то уверены, что там будет два файла с именами current и test.

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

Там с десяток каталогов, среди них всегда стабильно есть каталоги current и test.

Deleted
()

метод без self в аргументах или декоратора class/staticmethod

Заявка на успех.

Deleted
()
Ответ на: комментарий от vurdalak

Закоментил строчку с удалением, повесил на return список localArchivesRaw, итог:

# ./archives_parser.py
['docs', 'imgs', 'current', '.Trash-0', 'test', 'private', 'mix', 'trash']
Deleted
()

Он может не находить в списке ничего из-за того, что на предыдущей итерации было удаление? Если да, то как быть?

Deleted
()
Ответ на: комментарий от Deleted

Сделай так:

for localArchiveFake in Pathes.localArchivesFake:
    print('Fake:', localArchiveFake, 'Raw:', localArchivesRaw)
    localArchivesRaw.remove(localArchiveFake)
Посмотрим, что получится.

Кстати, какая это версия Питона, какая локаль в системе и какая кодировка исходников?

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Окей, соглашусь, что это дело привычки и для read-only скриптов не нужно.

beresk_let ★★★★★
()
Ответ на: комментарий от Deleted

А как ещё можно писать на каком-нибудь языке? :DD

Deleted
()
Ответ на: комментарий от proud_anon

Всё работает, там с именем каталога был непорядок.

Deleted
()
Ответ на: комментарий от Deleted

Я не гуру python, но я бы написал так:

class Paths:

    archiveDir = os.path.join('mnt', 'Arch')
    localArchivesFake = ['current', 'test']

    def localArchiveDirs(self):
        archDirs = os.listdir(self.archiveDir)
        archExclude = self.localArchivesFake
        archRaw = [archDir for archDir in archDirs if archDir not in archExclude]
        archPaths = map(lambda a: os.path.join(self.archiveDir, a, 'last', 'dirname'), archRaw)
        archives = [archPath for archPath in archPaths if os.path.isfile(archPath)] or []

        return archives

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 1)
Ответ на: комментарий от beresk_let

Лол, а почему и компрехеншны, и map? Как раз эти длинные портянки через filter лучше бы выглядели.

or []

А зачем?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от beresk_let

[archDir for archDir in archDirs if archDir not in archExclude]

Это генератор, я так понимаю?

Я просто стараюсь писать как можно более простой код, поэтому не хочу особо налегать на «нагруженные» строки.

А что даёт self? Из мануалов непонятно.

Deleted
()
Ответ на: комментарий от Deleted

Лол, а почему и компрехеншны, и `map`?

Не умею в map с условиями (читай — забыл про filter).

Как раз эти длинные портянки через `filter` лучше бы выглядели.

Полностью согласен (вероятно, мой мозг спит).

А зачем?

Мне примерещилось, что портянка может обернуться None.

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 1)
Ответ на: комментарий от Deleted

Вторая версия, с учётом сказанного выше proud_anon'ом и postman_'ом:

class Paths:

    archiveDir = '/mnt/Arch/'
    localArchivesFake = ['current', 'test']

    def localArchiveDirs(self):

        archDirs = os.listdir(self.archiveDir)
        archRaw = filter(lambda a: a not in self.localArchivesFake, archDirs)
        archPaths = map(lambda a: self.archiveDir + a + '/last/dirname', archRaw)

        return filter(lambda a: os.path.isfile(a), archPaths)

А что даёт self? Из мануалов непонятно.

Уверенность в том, что ты обратишься к переменной из того же класса, что и сам метод.

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 1)
Ответ на: комментарий от Deleted

А что даёт self? Из мануалов непонятно.

(c) http://bash.im/quote/431716

Объяснение self в python:

‎dark‎: у котов внутри есть мурчалка
dark‎: она реализована для всех котов в классе кот
‎dark‎: в объекте кот надо как то вызвать метод мурчало у класса кот
‎dark‎: как ты это сделаешь?
dark‎: кот.мурчало()
‎dark‎: ежели ты вызовешь кот.мурчало(), муркнут сразу все коты на свете
‎dark‎: а ежели ты вызовешь self.мурчало(), муркнет только тот кот, на которого указывает self
IIIypuk ★★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)
Ответ на: комментарий от IIIypuk

В смищной цитатке не раскрыта тема дескрипторов и __getattr(ibute)__. Вердикт: на помойку.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.