我创建了这个“两个循环”方法,假设如果我将一个句子标记为列表[w1,w2,w3,..,wn],我想输出以下对(不使用双字): / p>
for i in range(len(words)):
for j in range(i+1, range(len(words))):
couples = (words[i], words[j])
但是我想以lambda函数格式使用以便在我的Apache Spark程序中使用。有人可以帮我吗?
预先感谢
答案 0 :(得分:5)
我将从直接遍历列表开始:
df2 = df.txt.apply(fn)
df2.columns = ['test_id', 'winner_id', 'original_id', 'block_id',
'w_views', 'w_clicks', 'w_recirc', 'w_time',
'o_views', 'o_clicks', 'o_recirc', 'o_time']
但是,这给出了完整的笛卡尔积,与您原来的笛卡尔积并不完全相同。因此,我们需要第一个循环的索引,而不是第二个循环:
for x in words:
for y in words:
couples = x, y
现在我们可以将其转换为生成器表达式(而不是lambda):
for i, x in enumerate(words):
for y in words[i:]:
couples = x, y
答案 1 :(得分:1)
使用itertools中的组合将获得所需的结果。
from itertools import combinations
for tup in combinations(words, 2):
print(tup)
('This', 'is')
('This', 'an')
('This', 'example')
('This', 'sentence')
('is', 'an')
('is', 'example')
('is', 'sentence')
('an', 'example')
('an', 'sentence')
('example', 'sentence')