Вы можете создать класс, который обертывает 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
, но это, вероятно, самое удобное решение.
Один из способов сделать это - использовать библиотеку 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
Вот простой способ (хотя и менее pythonic, чем AChampion) для достижения желаемого:
ind = 0
for i in data_1:
for _ in range(2):
print('{}, {}'.format(i, data_2[ind]))
ind += 1
itertools.count()
часто является хорошим выбором, ind = itertools.count()
, затем data_2[next(ind)]
, и вы можете устранить ind += 1
. Вы также можете включить это в понимание списка, если результаты были необходимы.
– AChampion
13 July 2018 в 05:23
data_1
и data_2
любой длины.
– PM 2Ring
13 July 2018 в 05:24
data_1
выводился дважды. Это решение будет работать до тех пор, пока len(data_2) >= 2 * len(data_1)
будет выглядеть так. Если нет, следует добавить соответствующую логику обработки, чтобы уловить / предотвратить последующую IndexError
.
– Farhan
13 July 2018 в 05:38
data_1
выводился дважды. Но, возможно, они хотят более динамичного решения. Например, если data_2
содержит 6 элементов (и data_1
остается неизменным), то они могут потребовать, чтобы каждый data_1
выводился три раза.
– PM 2Ring
13 July 2018 в 05:44
Возможно, менее привлекательным был бы подход 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')]
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
/
. Что касается жесткого кодирования 2, мой предыдущий ответ, который я удалял, мог обрабатывать переменную длину, но проблема в том, что я не знаю, что хотел бы OP, если бы длины были разными
– RohithS98
13 July 2018 в 05:35
from __future__ import division
в верхней части вашего импорт. Таким образом вам не понадобится этот вызов float()
. Фактически, вы должны сделать from __future__ import print_function, division
, чтобы получить печать Python 3. Это поможет вам привыкнуть к Python 3, и это облегчит пользователям Python 3 запуск вашего кода.
– PM 2Ring
13 July 2018 в 05:53
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])
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:29it.chain.from_iterable(zip(*it.tee(data_1, n)))
– AChampion 13 July 2018 в 05:31