Skip to main content
 首页 » 编程设计

python双列表理解对scala等效

2025年05月04日28bjzhanghao

尝试将一些 pySpark 转换为等效的 scala,但我对双列表理解的正确语法有疑问。该代码采用键值列表,并以元组形式返回同一键出现的值列表。意思是 (2, ('user1','user2','user3')) 会返回 (('user1','user2'),('user1','user3'),('user2','user3') ).

#source rdd 
[(2, ['user1', 'user3']), (1, ['user1', 'user2', 'user1']), (3, ['user2', 'user4', 'user4', 'user3'])] 
 
#current list comprehension in pySpark 
rdd2 = rdd.flatMap(lambda kv: [(x, y) for x in kv[1] for y in kv[1] if x < y]) 
 
//scala attempt to make equivelent is currently throwing errors for syntax issues 
val rdd2 = rdd.flatMap((x,y) => for (x <- _(1)) yield x for(y <- _(1)) yield y if x < y) 

请您参考如下方法:

Scala 在理解中支持多个迭代器。

试试这个

val rdd2 = rdd.flatMap { 
  case (_, v) =>  for { 
    x <- v 
    y <- v if x < y  
  } yield (x,y) 
} 

注意事项

下划线不会像您那样工作(两次);无论哪种方式,使用 Scala 的模式匹配展开元组都更加清晰(并且更接近 Python*)。由于您不使用第一个元组项,您可以在那里使用下划线来“丢弃它”。

*FWIW,您可以使 Python 稍微整洁一些:

lambda (_,v): [(x, y) for x in v for y in v if x < y]