Длина возвращаемого значения из функции - PullRequest
0 голосов
/ 19 февраля 2019

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

import random


def randomize(*seq):
    shuffled = list(seq)
    for i in shuffled:
        random.shuffle(i)
    return iter(shuffled)


colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

for i in randomize(colors, shapes):
    print(i)

Она работает как есть.

Что мне бы хотелось дополнительнодолжен иметь возможность получить len () для возвращаемого значения.

  • Если я сделаю len(randomize(colors)), я должен получить обратно 4.
  • Если я сделаю len(randomize(colors, shapes))Я должен вернуться 8.

Я получаю эту ошибку: Expected type 'Sized', got 'Iterator' instead.

смотрел на len() против __len__, но я просто не уверен, какчтобы решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Я думаю, вы хотите что-то вроде этого - он объединяет ваши списки и затем перетасовывает их

import random
import itertools

def randomize(*seq):
    shuffled = list(itertools.chain.from_iterable(seq))
    random.shuffle(shuffled)
    return iter(shuffled)


colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

res = list(randomize(colors, shapes))
for i in res:
    print(i)

print('length: {}'.format(len(res)))

Если вы не хотите этого, это также работает:

import random
import itertools

def randomize(*seq):
    shuffled = list(seq)
    for i in shuffled:
        random.shuffle(i)
    return iter(shuffled)


colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

length = len(list(itertools.chain.from_iterable( randomize(colors, shapes))))
print('length: {}'.format(length))

for i in randomize(colors, shapes):
    print(i)
0 голосов
/ 19 февраля 2019

Отбросьте iter звонок из возврата.Цикл будет работать без него.

def randomize(*seq):
    shuffled = list(seq)
    for i in shuffled:
        random.shuffle(i)
    return shuffled

colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

randomized = randomize(colors, shapes)
print('number of lists', len(randomized))
print('total number of elements', sum([len(l) for l in randomized]))

for i in randomized:
    print(i)

Чтобы избежать необходимости суммировать возвращаемые списки, вам нужно изменить возвращаемое значение randomize, и это зависит от того, что вы хотите получить.Самым простым изменением было бы просто объединить списки после их перетасовки.

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