LINUX.ORG.RU

Опять работа со списком в цикле

 


0

2
for sliceString in inputSliceContent:
	    if '@' in sliceString:
			inputSliceContent.remove(sliceString)
			
			childSliceContent = call(["/media/mix/proj/yaback/yaback_slice_parser/yaback_slice_parser.py", sliceString[1:]])
			
			if childSliceContent:
				inputSliceContent.extend(childSliceContent)
			
print(inputSliceContent)

Парсится список, если есть строки, которые начинаются на @ (кстати, как сформировать условие, чтобы срабатывало на собачку именно в начале строки?), то вызывается этот же скрипт для парсинга дочернего списка. Но на списке с двумя подсписками парсится и разворачивается только первый, второй тупо печатается без обработки. Что я сделал не так?

Deleted

sliceString.startswith('@')

Когда ты удаляешь элемент через remove, у тебя сдвигается весь список. Следующий элемент становится текущим, а потом ты переходишь к ещё более следующему, и текущий остаётся без обработки.

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

E ★★★
()
Последнее исправление: E (всего исправлений: 1)

кстати, как сформировать условие, чтобы срабатывало на собачку именно в начале строки?

str.startswith

вызывается этот же скрипт для парсинга дочернего списка

Форк-бомбы там что ли лепишь?

Что я сделал не так?

Для начала - смешал табы и пробелы. Да и вообще воспользовался табами.

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

Для начала - смешал табы и пробелы

Не смешивал, это форумный парсер перекорявил. Вообще да, только табами пользуюсь.

Форк-бомбы там что ли лепишь?

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

Deleted
()

А зачем ты модифицируешь тот же список по которому идёт цикл?

no-such-file ★★★★★
()
Ответ на: комментарий от E

Да, тоже сейчас об этом подумал, и сделал с новым списком.

resultSliceContent = []
	for sliceString in inputSliceContent:
		if '@' in sliceString:
			childSliceContent = call(["/media/mix/proj/yaback/yaback_slice_parser/yaback_slice_parser.py", sliceString[1:]])
			
			if childSliceContent:
				resultSliceContent.extend(childSliceContent)
		else:
			resultSliceContent.append(sliceString)
	
	print(resultSliceContent)

Теперь вот что напрягает: в результате получается, как бы это назвать, тройной список. То есть, отдельно идёт список от первого подсписка, отдельно - от второго подсписка, и отдельно - пустой список, который инициализируется в начале. Всё это от print(resultSliceContent)

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

Указать на проблемы в твоем посте?

1. Игнорирование PEP8.

2. Покровительствующий тон.

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

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

Вообще-то нет. По PEP8 нужно использовать 4 пробела. Хотя лично я симпатизирую табуляции, и где нет конвенций - использую её, но не в Python.

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

Всё, что в скрипте, обернуть в функцию? Не могу сообразить, как это будет выглядеть. У меня скрипт читает файл-список, в котором могут быть ссылки на другие файлы-списки (эти ссылки и начинаются на @). Перед процитированным куском кода ещё идут функции на поиск и чтение файла-списка, и всё такое.

Deleted
()
Ответ на: комментарий от Deleted
while input_content:
    new_content = []
    for item in input_content:
        if some_condition(item):
            new_content.extend(some_process(item))
    input_content = new_content
E ★★★
()
Ответ на: комментарий от fludardes

Вообще-то нет. По PEP8 нужно использовать 4 пробела

А PEP8 - это что, уголовный кодекс? Читаем вводную:

This document gives coding conventions for the Python code comprising the standard library in the main Python distribution

ТС же не пишет «standard library in the main Python distribution», какого лешего ему соблюдать этот PEP?

no-such-file ★★★★★
()
Ответ на: комментарий от Deleted

Всё, что в скрипте, обернуть в функцию?

Да. Ну в любом случае, не вызывать же тот же скрипт по абсолютному пути.

Кстати, если call — это subprocess.call, он вернёт тебе код выхода программы, а не её вывод.

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

Вчитался ещё раз, я так понял, тебе просто нужно раскрыть «подсписки», не меняя основного списка? Тогда проигнорируй мой предыдущий ответ, твой код правильный.

По поводу тройного списка не понял. Ты печатаешь содержимое внутри цикла, что ли?

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

Перед процитированным куском кода ещё идут функции на поиск и чтение файла-списка, и всё такое.

Ну вынеси этот код в отдельные функции, делов-то.

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

Да, вместо вот этих ссылок, которые начинаются на @, нужно вставить содержимое соответствующих списков.

В том и дело, что вне цикла.

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

Общий пример:

def get_entries(s, breadth=False):
    sublists = []
    for name in s.split(','):
        if name.startswith('@'):
            lst = globals()[name[1:]]
            if breadth:
                sublists.append(lst)
            else:
                yield from get_entries(lst)
        else:
            yield name
    for lst in sublists:
        yield from get_entries(lst)


sublist1 = "1,2,3,@sub2,323"
sub2 = "a,b,c"

lst = "x,y,@sublist1,z,g,h,@sub2"

print(repr(list(get_entries(lst))))
print(repr(list(get_entries(lst, breadth=True))))
['x', 'y', '1', '2', '3', 'a', 'b', 'c', '323', 'z', 'g', 'h', 'a', 'b', 'c']
['x', 'y', 'z', 'g', 'h', '1', '2', '3', 'a', 'b', 'c', '323', 'a', 'b', 'c']
Deleted
()
Ответ на: комментарий от no-such-file

А PEP8 - это что, уголовный кодекс?

Да.

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

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

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

Для начала - смешал табы и пробелы. Да и вообще воспользовался табами.

Табы — это хорошо и правильно. А пробелы вот не нужны. Зачем пробелы, если есть табы специально для отступов на заданную глубину?

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

Никак не пойму, здесь проводится перепись мамкиных копротивляторов PEP8? Тогда вы забыли позвать Goury.

Deleted
()

childSliceContent = call([«/media/mix/proj/yaback/yaback_slice_parser/yaback_slice_parser.py», sliceString[1:]])

А вот до этого надо ещё додуматься. Надо же. Мне бы никогда такое в голову не пришло. Браво!

Kilte ★★★★★
()

Если я тебя правильно понял, то можно сделать через list compression достаточно просто:

import itertools

raw_data = ["@sadf", "@sadfsdf", "sdfdsf", "@sedfsf"]

def foo(data):
    return [data, data]

list(itertools.chain(*[ foo(elem) for elem in raw_data if '@' in elem]))

Результат:

>>> list(itertools.chain(*[ foo(elem) for elem in raw_data if '@' in elem]))
['@sadf', '@sadf', '@sadfsdf', '@sadfsdf', '@sedfsf', '@sedfsf']
Norgat ★★★★★
()
Ответ на: комментарий от Deleted

Я и сам когда-то подобные перлы сочинял. Всё-таки рекомендую почитать книжку, документацию в конце-концов. И всё будет получаться гораздо лучше.

Kilte ★★★★★
()
Ответ на: комментарий от no-such-file

ТС же не пишет «standard library in the main Python distribution», какого лешего ему соблюдать этот PEP?

Он может не соблюдать, но если не хочет быть кодобыдлом, правила хорошего тона нужно блюсти.

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

Зачем пробелы, если есть табы специально для отступов на заданную глубину?

в итоге у одного код выглядит так, у другого эдак

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

Зачем пробелы, если есть табы специально для отступов на заданную глубину?

Основной аргумент пробелофилов, что такой код:

if someLongAndBoringCondition and
   anotherMoreLongAndInfuriatingCondition:
       DWIM()
При использовании табов будет выглядеть по-разному, в зависимости от настройки ширины таба. При этом, т.к. вторая строчка довыравнивается пробелами, то она «уедет» при другой длине таба. В питоне это, увы, гигантская проблема, потому что т.к. они отказались от скобочек, то не могут сделать так, выравнивая всё на таб:
if (
    someLongAndBoringCondition                  &&
    someLongAndBoringConditionPhase2            &&
    anotherSomewhatLongerInfuriatingCondition    
) {
    dwim();
}

no-such-file ★★★★★
()

#!/usr/bin/env python3

list_1 = ['aaa', 'bbb', 'ccc', '@list_2', 'ddd']
list_2 = ['aaaaa', 'bbbbb', '@list_3', 'ccccc', '@list_4']
list_3 = ['111', '222', '333']
list_4 = ['one', 'two']

lists = {
    'list_2': list_2,
    'list_3': list_3,
    'list_4': list_4,
}


def parse(list_):
    result = []

    for item in list_:
        if item.startswith('@'):
            result.extend(parse(lists[item[1:]]))
        else:
            result.append(item)

    return result


print(parse(list_1))


ovno
()
Ответ на: комментарий от no-such-file

Основной аргумент пробелофилов, что такой код <…> При использовании табов будет выглядеть по-разному, в зависимости от настройки ширины таба.

нет. ты вообще читаешь что тебе люди отвечают?

основной аргумент пробелофилов-питонщиков это то что в питоне есть общепринятая конвенция — 4 пробела — и нет причин (кроме собственного уебанства) писать новый код ей не соответствующий.

val-amart ★★★★★
()

кстати, как сформировать условие, чтобы срабатывало на собачку именно в начале строки?

if sliceString[0] == '@'
    ...

не?

Если я правильно понял суть.

te111011010
()
Ответ на: комментарий от val-amart

что в питоне есть общепринятая конвенция — 4 пробела

Т.е. если бы в PEP8 или ещё где написали бы, что нужно 2 пробела или 10 пробелов и 1 таб, то они бы кушали и радовались? Так я об этом и говорю - налицо бездумное приятие чужого решения, без понимания почему оно было принято, в чём плюсы и минусы.

no-such-file ★★★★★
()
Ответ на: комментарий от lazyklimm

у одного таб в 4 пробела, у другого в 8, у третьего 2

Так это же отлично. Каждый настроит так, как ему нравится. Тебе-то какое дело?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Табы безусловно удобнее. 4 пробела вместо таба это какая-то паранойя.

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

в питоне есть общепринятая конвенция — 4 пробела — и нет причин (кроме собственного уебанства) писать новый код ей не соответствующий

Не всем нравится отступ в 4 пробела, поэтому разумно использовать табуляцию и настраивать отступ в редакторе. А если кто-то считает это уебанством, так он, скорее всего, и сам уебан ;)

tailgunner ★★★★★
()

alexferman  — Я у мамы нубопогроммист на Python

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

Разумно использовать четыре пробела и настраивать автозамену табов на пробелы в редакторе.

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