在一个lambda函数中转换两个for循环方法

时间:2019-04-18 19:07:34

标签: python function lambda

我创建了这个“两个循环”方法,假设如果我将一个句子标记为列表[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])
  • w1,w2
  • w1,w3
  • w1,w4
  • ....
  • ....
  • w2,w3
  • w2,w4
  • ....

但是我想以lambda函数格式使用以便在我的Apache Spark程序中使用。有人可以帮我吗?

预先感谢

2 个答案:

答案 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')