Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132

Как определить бесконечный список?

04.09.2020, 11:58. Показов 6487. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Есть такая ситуация: в результате работы кода, появляются бесконечно вложенные друг в друга списки (указывающие сами на себя). Например,

Python
1
2
bio  = [[]]
bio[0].append(bio[0])
На выходе имеем такую дрянь [[...]], с которой дальше работать невозможно. Вопрос: можно ли каким-либо образом определить, что список является бесконечным? Type показывает обычный <class 'list'>.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2020, 11:58
Ответы с готовыми решениями:

Бесконечный список
Помогите с задачей. Ума не приложу. Под именами х и у заданы списки Лиспа (a (b c) и (d e), соответственно. Нужно используя их, и не...

Бесконечный чередующийся список мороженого
data Sort = Vanil | Malina | Shokolad deriving Show data Ice = Ice Sort Ice | Waflja infinityIce :: Ice infinityIce = let list = map...

Опишите бесконечный список чисел [1,-1,1,-1,...]
А) опишите бесконечный список чисел Б) с помощью этого списка, списка и функции zipWith опишите бесконечный список Заранее спасибо)

22
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
04.09.2020, 12:03  [ТС]
Цитата Сообщение от ioprst Посмотреть сообщение
NatiF, не может список быть бесконечным.
А что это такое [[...]] тогда?
0
04.09.2020, 12:07

Не по теме:

NatiF, я ошибся.

0
Эксперт Python
 Аватар для dondublon
4649 / 2069 / 366
Регистрация: 17.03.2012
Сообщений: 10,178
Записей в блоге: 6
04.09.2020, 12:29
NatiF, вообще способ есть, но лучше вам его не знать. Потому что надо разобраться, почему такая дрянь получается и исправить.
0
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
04.09.2020, 13:06
NatiF,
Сам же и ответил -
Type показывает обычный <class 'list'>.
Вот и распаковывай со счетчиком, пока не будет <class 'list'>...

Добавлено через 5 минут
А если грубо, то через ~
Python
1
str(bio).count("[")
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.09.2020, 13:27
Цитата Сообщение от NatiF Посмотреть сообщение
в результате работы кода, появляются бесконечно вложенные друг в друга списки
Просто не надо класть яйца в ...яйца.
Ни у кого из программистов (кроме школьников) никогда не возникало такой проблемы как у тебя. Делай выводы.
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
04.09.2020, 13:46  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Просто не надо класть яйца в ...яйца.
Ни у кого из программистов (кроме школьников) никогда не возникало такой проблемы как у тебя. Делай выводы.
Спасибо, конечно, но вряд ли школотроны писали самопостроитель через рандомную генерацию.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.09.2020, 13:52
Цитата Сообщение от NatiF Посмотреть сообщение
вряд ли школотроны писали
Писали-писали.
И они тоже не знали про то, как в Python делать копию данных вместо ссылки.

Добавлено через 4 минуты
Вот этот вот код
Python
1
2
bio  = [[]]
bio[0].append(bio[0])
очень легко сделать не бесконечно рекурсивным.
0
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
04.09.2020, 14:00
Если степень вложенности, то можно так (желательно максимальную длину вложенного списка не больше 2)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bio = [[[[[0,[[[[0]]]]]],0]]]
k_max = 0
n = 0
for i in str(bio) :
    if i == "[" :
        n += 1
    k_max = max(n,k_max)
    if i == "]" :
        n -= 1
print("k_max =", k_max)
# второй способ
k = 0
while isinstance(bio, list):
    if len(bio) > 1 :
        for i in bio :
            if isinstance(i,list) :
                bio = i
                k += 1
    if isinstance(bio, list):
        bio = bio[-1]
        k += 1
print("k =",k)
При неопределенной длине вложенных списков реализация через рекурсию.

Добавлено через 6 минут
Более подробно по распаковке:
https://www.pvsm.ru/python/328552
1
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
04.09.2020, 14:58  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
очень легко сделать не бесконечно рекурсивным.
Да знаю я про copy.
Python
1
bio[0].append(bio[0].copy())
Но есть подозрения, что генерируемый код при исполнении, каким-то образом и очень редко, но всё же производит такие бесконечные списки, потому что иногда при попытке принтить список через рекурсию, вылезает бесконечный цикл, а потом питон крашится из-за переполнения стэка или выскакивает исключение. Я ищу путь, как убирать такие списки, если они появляются. Искать в коде, почему это происходит, вероятно, тяжелее.
0
Эксперт Python
 Аватар для АмигоСП
295 / 108 / 57
Регистрация: 07.12.2016
Сообщений: 209
04.09.2020, 15:28
NatiF, может как-то так подойдет?
Python
1
2
3
bio = [[[[[0, [[[[1]]]]]], 2]]]
new_bio = [int(i) for i in str(bio).replace('[', '').replace(']', '') if i not in [',', ' ']]
print(new_bio)
0
Эксперт Python
 Аватар для dondublon
4649 / 2069 / 366
Регистрация: 17.03.2012
Сообщений: 10,178
Записей в блоге: 6
04.09.2020, 15:33
Цитата Сообщение от NatiF Посмотреть сообщение
Искать в коде, почему это происходит, вероятно, тяжелее.
Ясное дело. Но это правильно.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
04.09.2020, 18:27
Лучший ответ Сообщение было отмечено NatiF как решение

Решение

Вот способ распознания циклической (бесконечной) структуры:

Python
1
2
3
4
5
6
7
8
bio  = [[]]
bio[0].append(bio[0])
print(id(bio[0]))
print(id(bio[0][0]))
 
qwe = [[[]]]
print(id(qwe[0]))
print(id(qwe[0][0]))
140275051180616 <- адр bio[0]
140275051180616 <- адр его нулевого элемента совпадает с ним самим - цикл !

140275051173064 <- здесь
140275051173128 <- все хорошо

Добавлено через 2 минуты
Кстати, можно и без лишних скобок создать циклическую структуру:

Python
1
2
3
4
5
bio  = []
bio.append(bio)
print(id(bio))
print(id(bio[0]))
print(bio)
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
04.09.2020, 18:56
NatiF, Сами подумайте. Список это объект питона занимающий некоторое количество оперативной памяти. При каждом вложении Вы увеличиваете количество занимаемой памяти. Количество памяти в компьютере ограничено. Если Вы будете производить бесконечное вложение, то количество занимаемой памяти будет постоянно увеличиваться, пока не произойдет переполнение, и компьютер перестанет работать и предварительно сообщит об ошибке.
Поэтому, что бы не доводить до сбоя программы, питон обнаружив зацикленность преобразует бесконечное вложение в такую форму [[...]]. Что является предупреждением, что такой код не допустим и нужно его изменить, что бы не было зацикленности. Поэтому Вам нужно не жаловаться на [[...]] , а описать Вашу задачу, и попросить помочь избавиться от зацикливания.

Добавлено через 4 минуты
NatiF, Опишите условие Вашей задачи и Ваш код ее решения. Тогда народ поможет его исправить, что бы не было зацикливания.

Добавлено через 5 минут
NatiF, Скорее всего Вам понадобится код с рекурсией и с выходом из рекурсии по некоторому условию, для того , что бы не произошло переполнение.
А может нужно решать не через рекурсию, а просто циклом, все зависит от условия задачи, которое Вы не описали.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.09.2020, 20:09
Цитата Сообщение от NatiF Посмотреть сообщение
Да знаю я про copy.
Не только через copy.
Но не суть. Catstail, предложил сравнивать id (который в Python возвращает нечто аналогичное адресу) вкладываемого элемента и id контейнера. Это позволит выявить момент, когда происходит вставка в список того же самого списка, чтобы вызвать вручную в этом месте raise Exception или же заменять его на копию.

Добавлено через 1 минуту
P.S. А самопостроитель это кто? Кодогенератор? И в чем конкретный смысл вашей задачи?
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
05.09.2020, 01:21  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Вот способ распознания циклической (бесконечной) структуры
Спасибо. То, что нужно.

Добавлено через 12 минут
Цитата Сообщение от Garry Galler Посмотреть сообщение
P.S. А самопостроитель это кто? Кодогенератор? И в чем конкретный смысл вашей задачи?
Да, кодогенератор. Он генерит рандомный код и помещает его тоже рандомно в список или во вложенные в него другие списки. Конкретный смысл тут не объясню, - сложно. Это делается по направлению "Искусственная жизнь" для статьи.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.09.2020, 12:59
Цитата Сообщение от NatiF Посмотреть сообщение
Он генерит рандомный код
А что за кодогенератор? Ваш собственный или библиотека? (просто любопытно)
В Python, например, есть такая экзотика как диалект Лиспа - Hylang, который умеет генерить AST Python.
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
05.09.2020, 13:09  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
А что за кодогенератор? Ваш собственный или библиотека? (просто любопытно)
Собственный. AST я, к сожалению, не знаю, поэтому пришлось убить, наверное, 2-3 недели, чтобы своими руками написать. При этом мне изначально нужен был if-elif-else генератор. Если интересно, я вот тут https://habr.com/ru/post/504296/ статью на Хабре выкладывал.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.09.2020, 13:14
Цитата Сообщение от NatiF Посмотреть сообщение
Если интересно, я вот тут
Ок. Почитаю. :-)
0
Эксперт Python
 Аватар для dondublon
4649 / 2069 / 366
Регистрация: 17.03.2012
Сообщений: 10,178
Записей в блоге: 6
05.09.2020, 20:13
Цитата Сообщение от Viktorrus Посмотреть сообщение
. При каждом вложении Вы увеличиваете количество занимаемой памяти.
Нет. Просто добавляется ссылка на себя, занимаемая память не увеличивается.

Цитата Сообщение от Catstail Посмотреть сообщение
Вот способ распознания циклической (бесконечной) структуры:
Только для случая в примере. Для общего случая не пойдёт. Поэтому я и говорю, надо править код, чтобы такого не возникало.
Ну или иной подход - считать, что такие списки позволены, но тогда не жаловаться, что "с этой дрянью работать невозможно".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2020, 20:13
Помогаю со студенческими работами здесь

Бесконечный список совершенных чисел
Здравствуйте! Помогите пожалуйста дополнить программу. Вот задание: Сгенерировать бесконечный список совершенных чисел. Пока что,...

Бесконечный список объектов класса?
В данный момент изучаю тему Классы и пробую практиковаться.:) И недавно возник вопрос: как сделать список объектов с количество заданным...

Бесконечный список съел один елемент
Доброго времени суток, Случилась вот такая нелепая проблема, когда я делал лабораторную работу. Односторонний список должен...

Бесконечный список чисел Пелля-Люка
а) Используя функцию iterate, написать функцию, которая строит бесконечный список чисел Пелля-Люка б) Написать функцию, которая читает...

Составить бесконечный список последовательностей биномиальных коэффициентов
Здравствуйте! Так вышло, что в сжатые сроки нужны решения некоторых задач. Решал бы сам, если бы не был занят проектом. Как уже поняли с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru