Зацикливание с условием

Вы можете создать класс, который обертывает Action и реализует этот интерфейс:

public sealed class SomeAction : ISomeInterface
{
    Action action;
    public SomeAction (Action action) { this.action = action; }
    public void DoIt() { this.action(); }
}

Это позволяет использовать его следующим образом:

object.myMethod(new SomeAction(() => Console.WriteLine("yay"));

Это конечно, очень практично, если вы собираетесь повторно использовать SomeAction, но это, вероятно, самое удобное решение.

1
задан muthikin 13 July 2018 в 05:03
поделиться

5 ответов

Один из способов сделать это - использовать библиотеку itertools и zip(), например:

In []:
import itertools as it
n = 2   # No. of repetitions
list(zip(it.chain.from_iterable(it.repeat(x, n) for x in data_1), data_2))

Out[]:
[('text1', 'a'), ('text1', 'b'), ('text2', 'c'), ('text2', 'd')]

Или если вы хотите print() вывести каждый элемент:

In []:
for x in zip(it.chain.from_iterable(it.repeat(x, n) for x in data_1), data_2):
    print(', '.join(x))

Out[]:
text1, a
text1, b
text2, c
text2, d
3
ответ дан AChampion 17 August 2018 в 13:39
поделиться
  • 1
    Альтернативно it.chain.from_iterable(it.repeat(x, n) for x in data_1) можно записать как (x for x in data_1 for _ in range(n)), что является более читаемым ИМО. – Aran-Fey 13 July 2018 в 05:29
  • 2
    Правда, и, безусловно, более читабельна, чем мой оригинальный подход: it.chain.from_iterable(zip(*it.tee(data_1, n))) – AChampion 13 July 2018 в 05:31
  • 3
    Спасибо @AChampion, это действительно помогает мне – muthikin 13 July 2018 в 09:19

Вот простой способ (хотя и менее pythonic, чем AChampion) для достижения желаемого:

ind = 0
for i in data_1:
    for _ in range(2):
        print('{}, {}'.format(i, data_2[ind]))
        ind += 1
1
ответ дан Aran-Fey 17 August 2018 в 13:39
поделиться
  • 1
    Если вам нужен счетчик, тогда itertools.count() часто является хорошим выбором, ind = itertools.count(), затем data_2[next(ind)], и вы можете устранить ind += 1. Вы также можете включить это в понимание списка, если результаты были необходимы. – AChampion 13 July 2018 в 05:23
  • 2
    Было бы лучше не жестко кодировать 2. Попробуйте обрабатывать data_1 и data_2 любой длины. – PM 2Ring 13 July 2018 в 05:24
  • 3
    2 жестко закодирован, потому что OP хочет, чтобы каждый элемент в data_1 выводился дважды. Это решение будет работать до тех пор, пока len(data_2) >= 2 * len(data_1) будет выглядеть так. Если нет, следует добавить соответствующую логику обработки, чтобы уловить / предотвратить последующую IndexError. – Farhan 13 July 2018 в 05:38
  • 4
    Возможно, OP хочет, чтобы каждый элемент в data_1 выводился дважды. Но, возможно, они хотят более динамичного решения. Например, если data_2 содержит 6 элементов (и data_1 остается неизменным), то они могут потребовать, чтобы каждый data_1 выводился три раза. – PM 2Ring 13 July 2018 в 05:44
  • 5
    Спасибо @Farhan за помощь. – muthikin 13 July 2018 в 09:20

Возможно, менее привлекательным был бы подход double data_1:

data_1 = ['text1','text2', 'text3', 'text4', 'text5', 'text6']
data_2 = ['a','b','c','d', 'e,', 'f', 'g']

double_data_1 = []
[ double_data_1.append(e) for e in data_1 for ee in range(2) ]
res = zip(double_data_1, data_2)
list(res)

[('text1', 'a'),
 ('text1', 'b'),
 ('text2', 'c'),
 ('text2', 'd'),
 ('text3', 'e,'),
 ('text3', 'f'),
 ('text4', 'g')]
0
ответ дан gregory 17 August 2018 в 13:39
поделиться
data_1 = ['text1','text2']
data_2 = ['a','b','c','d','e']

print '\n'.join([data_1[i//2]+','+data_2[i] for i in range(min(len(data_1)*2,len(data_2)))])

Выход:

text1,a
text1,b
text2,c
text2,d

Для более обобщенного

from math import ceil
data_1 = ['text1','text2']
data_2 = ['a','b','c','d','e','f','g']

t = int(ceil(len(data_2)/float(len(data_1))))
print '\n'.join([data_1[i/t]+','+d for i,d in enumerate(data_2)])

Это будет работать до тех пор, пока data_1 будет короче, чем data_2

Output:

text1,a
text1,b
text1,c
text1,d
text2,e
text2,f
text2,g
1
ответ дан RohithS98 17 August 2018 в 13:39
поделиться
  • 1
    Отметил. Я изменю /. Что касается жесткого кодирования 2, мой предыдущий ответ, который я удалял, мог обрабатывать переменную длину, но проблема в том, что я не знаю, что хотел бы OP, если бы длины были разными – RohithS98 13 July 2018 в 05:35
  • 2
    Нехорошо догадываться, потому что так легко ошибиться. ;) Но, к сожалению, ОП не отвечает на просьбы о разъяснении. – PM 2Ring 13 July 2018 в 05:49
  • 3
    BTW, вам действительно стоит серьезно подумать о переносе на Python 3, Python 2 дойдет до официального конца жизни в 2020 году. В то же время вы можете получить поведение Python 3 в Python 2.6+ с from __future__ import division в верхней части вашего импорт. Таким образом вам не понадобится этот вызов float(). Фактически, вы должны сделать from __future__ import print_function, division, чтобы получить печать Python 3. Это поможет вам привыкнуть к Python 3, и это облегчит пользователям Python 3 запуск вашего кода. – PM 2Ring 13 July 2018 в 05:53
  • 4
    @ PM2Ring Спасибо за совет! – RohithS98 13 July 2018 в 05:55
  • 5
    – muthikin 13 July 2018 в 09:19
data_1 = ['text1','text2']
data_2 = ['a','b','c','d']

for i in range (len(data_1)):
    if i == (len(data_2)/2 -1):
        k=i+1
        data_2 = data_2[k:]
        for j in range(len(data_1)):
            print (data_1[i],data_2[j])
    else:
        for j in range(len(data_1)):
            print (data_1[i],data_2[j])
0
ответ дан Soubhik Banerjee 17 August 2018 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: