Могу ли я рекомендовать следующее решение? Функции main
и make_a_list
проверяют вашу идею и показывают, что лучше было ее реализовать соответственно. Если вы не против работать с понятием итерируемых объектов и генераторов, то функция test
и генератор flatten
могут стать лучшей демонстрацией того, как подойти к проблеме. Пожалуйста, скорректируйте свой код для наиболее желательного и лучше.
#! /usr/bin/env python3
def main():
obj = 1
print('make_a_list({!r}) = {!r}'.format(obj, make_a_list(obj)))
obj = {1, 2, 3}
print('make_a_list({!r}) = {!r}'.format(obj, make_a_list(obj)))
obj = [1, 2, 3]
print('make_a_list({!r}) = {!r}'.format(obj, make_a_list(obj)))
obj = [1]
print('make_a_list({!r}) = {!r}'.format(obj, make_a_list(obj)))
obj = 'a', 'b', 'c'
print('make_a_list({!r}) = {!r}'.format(obj, make_a_list(obj)))
obj = {1: 2, 3: 4, 5: 6}
print('make_a_list({!r}) = {!r}'.format(obj, make_a_list(obj)), end='\n\n')
def make_a_list(obj):
if isinstance(obj, dict):
return make_a_list(list(obj.keys())) + make_a_list(list(obj.values()))
if isinstance(obj, list):
if len(obj) > 1:
return make_a_list(obj[0]) + make_a_list(obj[1:])
return obj
return [obj]
def test():
obj = 1
print('list(flatten({!r})) = {!r}'.format(obj, list(flatten(obj))))
obj = {1, 2, 3}
print('list(flatten({!r})) = {!r}'.format(obj, list(flatten(obj))))
obj = [1, 2, 3]
print('list(flatten({!r})) = {!r}'.format(obj, list(flatten(obj))))
obj = [1]
print('list(flatten({!r})) = {!r}'.format(obj, list(flatten(obj))))
obj = 'a', 'b', 'c'
print('list(flatten({!r})) = {!r}'.format(obj, list(flatten(obj))))
obj = {1: 2, 3: 4, 5: 6}
print('list(flatten({!r})) = {!r}'.format(obj, list(flatten(obj))))
def flatten(iterable):
if isinstance(iterable, (list, tuple, set, frozenset)):
for item in iterable:
yield from flatten(item)
elif isinstance(iterable, dict):
for item in iterable.keys():
yield from flatten(item)
for item in iterable.values():
yield from flatten(item)
else:
yield iterable
if __name__ == '__main__':
main()
test()
В целом, можно проверить, если элемент итерации или нет (см, если он имеет '__iter__' метода среди его атрибутов), а затем перебрать его элементы. Если вы не думаете, что он слишком велик. С уважением. –
Или используйте абстрактные базовые классы в ['collections.abc'] (https://docs.python.org/3/library/collections.abc.html) –
вы должны использовать' isinstance' вместо 'type (a) == type ({}) '. По крайней мере, 'type (a) == dict'. Но используйте 'isinstance (a, dict)' –