在python中查找列表中的特定值并将错误获取为TypeError:列表索引必须是整数或片,而不是str

2024-09-28 01:28:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在pyspark中做一些手工操作,并且从一个特定的示例文件中,对于包“Rcpp”,我想知道有多少行属于它。我在pyspark中执行了以下操作以获得所需的结果

from pyspark import SparkConf, SparkContext
import collections

conf = SparkConf().setMaster("local").setAppName("RatingsHistogram")
sc = SparkContext(conf = conf)

lines = sc.textFile("<filepath>/2015-12-12.csv")
rdd=lines.map(lambda x: x.split(',')[6])
totalbypackage=rdd.map(lambda x: (x,1)).reduceByKey(lambda x,y: x+y)
data=totalbypackage.take(10) 
#this was just to view the first 10 records
print(type(data))
print(data)

对于上面的代码,我得到以下结果

[(“package”,1),(“HistData”,159),(“RJSONIO”,1358),(“UsingR”,151),(“gridExtra”,1758),(“lme4”,1560),(“testthat”,1178),(“mvtnorm”,999),(“maps”,1586),(“sp”,1020)]

这仅仅是前10张唱片和它的列表。因为数据的类型是列表。 当我尝试执行下面的操作时,会出现错误,因为列表索引必须是整数或片,而不是str

print(data["Rcpp"])

在阅读了与同一错误相关的其他问题后,我了解到我们不能使用字符串值。那么,如何从列表中访问“Rcpp”的值呢? 我需要将列表转换为字典吗


Tags: lambdaimportmap列表dataconfpysparklines
2条回答

由于data由键值对组成,因此使用的自然数据结构是字典。然后可以通过其键访问任何值,例如:

data = [('"package"', 1), ('"HistData"', 159), ('"RJSONIO"', 1358), 
        ('"UsingR"', 151), ('"gridExtra"', 1758), ('"lme4"', 1560), 
        ('"testthat"', 1178), ('"mvtnorm"', 999), ('"maps"', 1586), 
        ('"sp"', 1020)]
data_dict = dict(data)

print(data_dict['"sp"'])
1020

您可能还希望更改代码,以便每个键只有一对引号

将列表转换为字典可能是一种选择,但我不建议这样做。它基本上破坏了最初使用pyspark/spark的动机

请注意,当您使用take(n)时,您正试图执行一个操作语句take(n)将n条记录转换为一个列表,当不同的“包”数量增加时,该列表效率不高(如果有100万种包怎么办?)。在take()之前使用filter()将是一种更好、更有效、更美观的方法

from pyspark import SparkConf, SparkContext

conf = SparkConf().setMaster("local").setAppName("RatingsHistogram")
sc = SparkContext(conf=conf)

lines = sc.textFile("<filepath>/2015-12-12.csv")
rdd = lines.map(lambda x: x.split(',')[6])
totalbypackage = rdd.map(lambda x: (x, 1)).reduceByKey(lambda x, y: x + y)

# Filter only the count record in which we are interested
rcpp_count_record = totalbypackage.filter(lambda x: x[0] == "Rcpp")

# Now as we only have 1 row, we can use take(1) or collect() to get only the count part
print(rcpp_count_record.take(1)[0][1])
print(rcpp_count_record.collect()[0][1])

两个print语句都将在控制台上显示“Rcpp”包的计数

如果有帮助,请考虑对这个答案进行投票。eem>

相关问题 更多 >

    热门问题