如何在列表推导式内完成排序?PySpark环境技术问询
问题解答
先修正你代码里的语法错误
你当前的创建列表代码存在对象调用错误,修正后正确写法如下:
# 创建列表 headers = [words.replace(' ', '_') for words in my_list] numbers = [nums.split()[0] for nums in my_list] # 排序 headers.sort(reverse=True) numbers.sort(reverse=True)
能否在列表推导式内直接完成排序?
普通Python环境下
可以直接通过在外层嵌套sorted()函数实现一步完成处理和排序,不需要先创建列表再单独调用sort()方法:
- 处理并排序headers:
headers = sorted([words.replace(' ', '_') for words in my_list], reverse=True) - 处理并排序numbers:
numbers = sorted([nums.split()[0] for nums in my_list], reverse=True)
这里sorted()会接收列表推导式的结果作为参数,直接返回一个已排序的新列表。
PySpark环境下的特殊处理
如果你的my_list是PySpark的RDD或DataFrame数据(而非本地Python列表),上述本地列表的处理方式不适用,需要使用PySpark原生API操作:
基于RDD处理:
from pyspark import SparkContext sc = SparkContext.getOrCreate() rdd = sc.parallelize(my_list) # 处理并排序headers headers = rdd.map(lambda x: x.replace(' ', '_')).sortBy(lambda x: x, ascending=False).collect() # 处理并排序numbers(注意转成int避免字符串字典序排序) numbers = rdd.map(lambda x: int(x.split()[0])).sortBy(lambda x: x, ascending=False).collect()基于DataFrame处理:
from pyspark.sql import SparkSession from pyspark.sql.functions import split, col, regexp_replace spark = SparkSession.builder.getOrCreate() df = spark.createDataFrame([(item,) for item in my_list], ["value"]) # 处理并获取排序后的headers headers = [row.header for row in df.select( regexp_replace(col("value"), " ", "_").alias("header") ).orderBy(col("header").desc()).collect()] # 处理并获取排序后的numbers numbers = [row.number for row in df.select( split(col("value"), " ")[0].cast("int").alias("number") ).orderBy(col("number").desc()).collect()]
内容的提问来源于stack exchange,提问作者pkpto39
相关产品推荐
相关产品推荐

