2016-10-28 3 views
2
def alternate(*args): 
    l = '' 
    c = 0 
    while True: 
     try: 
      iterable = args[c] 
      i = iter(iterable) 
      l = l + next(i) 
      c = c + 1 
     except: 
      break 
    yield l 

Альтернативный генератор принимает любое количество итераций в качестве параметров: он производит первое значение из первого параметра, затем первое значение из второго параметра, ..., затем первое значение из последнего параметра; затем второе значение из первого параметра, затем второе значение из второго параметра, ..., затем второе значение из последнего параметра; и т. д. Если какой-либо итерабельность не производит больше значений, этот генератор не производит больше значений. Например:Функция, которая принимает итерации и возвращает строку

for i in alternate('abcde','fg','hijk'): 
    print(i,end='') 

ответ:

afhbgic 

когда моя функция принимает

('abcde','fg','hijk') 

возвращает

afh 

, но правильный ответ

afhbgic 

может кто-нибудь сказать мне, как это исправить? большое спасибо!

+0

Мне просто нужно, чтобы получить правильный вывод – jiahuiding

+0

Да, я так думаю – jiahuiding

+0

Как насчет 'zip'ping' args', а затем присоединяется к полученным наборам (' '' .join() '), а затем присоединяется к результатам этих объединений? – BallpointBen

ответ

0

насчет решения, как это:

def alternate(*args): 
    l = '' 

    # initialize iterators for each argument 
    iterators = [iter(it) for it in args] 

    # iterate over lengths, using iterators 
    while True: 
     for it in iterators: 
      try: 
       l = l + next(it) 
      except StopIteration: 
       return l 

    return l 


result = alternate('abcde','fg','hijk') 
print(result) # afhbgic 
+0

спасибо, он действительно работал для ввода строки. вы знаете, как заставить его работать и для генератора? потому что генератор не имеет len() – jiahuiding

+0

@ jiahuiding Я вижу, что вы meen. Позвольте мне немного. – Marcin

+0

@jiahuiding Отредактировал мой андерсер. Теперь он взаимодействует, пока первый итератор не завершит исключение StopIteration. – Marcin

1

Если вы должны иметь генератор, вы можете использовать itertools.zip_longest (izip_longest при использовании Python 2.x):

from itertools import zip_longest 


def alternate(*args): 
    for tup in zip_longest(*args): 
     for el in tup: 
      if el: 
       yield el 
      else: 
       return 

Выход:

>>> ''.join(alternate('abcde','fg','hijk')) 
'afhbgic' 
>>> 

Прочее мудрый, просто использовать нормальную функцию:

from itertools import zip_longest 


def alternate(*args): 
    s = '' 
    for tup in zip_longest(*args): 
     for el in tup: 
      if el: 
       s += el 
      else: 
       return s 

Выход:

>>> alternate('abcde','fg','hijk') 
'afhbgic' 
>>> 
0

Я так же, как такое безумие, извините :)

alternate = lambda args: ''.join(
    filter(
     lambda _, p={1:1}: _ if _ and p else p.clear(), 
     reduce(
      lambda x,y: x+y, 
      map(None, *args) 
     ) 
    ) 
) 
Смежные вопросы