导致 TypeError 的 Lambda 函数:“int”对象不可迭代

Posted

技术标签:

【中文标题】导致 TypeError 的 Lambda 函数:“int”对象不可迭代【英文标题】:Lambda function causing TypeError: 'int' object is not iterable 【发布时间】:2018-10-27 10:57:58 【问题描述】:

我刚开始学习 Python。我正在使用 API 来构建 IDF 模型,但是我遇到了一些无法解决的 lambda 函数错误。 这是生成 IDF 的类:

class Idfs(DocumentFrequencies, Model):

    def build(self, corpus):
        log.info('Counting documents in corpus...')
        N = float(corpus.count())
        dfs = super(Idfs, self).build(corpus)

        log.info('Building idf model: N=%i', N)
        return dfs\
           .map(lambda (term, (df,rank)): (term, df))\  
           .mapValues(lambda df: math.log(N/df))

    @staticmethod
    def format_item((term, idf)):
        return 
        '_id': term,
        'idf': idf,
        

这是计算 DF 的类:

class DocumentFrequencies(ModelBuilder):

    def __init__(self, lowercase=False, max_ngram=1, min_df=2):
        self.lowercase = lowercase
        self.max_ngram = max_ngram
        self.min_df = min_df

    def build(self, docs):
        m = docs.map(lambda d: d['text'])
        if self.lowercase:
            m = m.map(lambda text: text.lower())

        return m\
            .flatMap(lambda text: set(ngrams(text, self.max_ngram)))\
            .map(lambda t: (t, 1))\
            .reduceByKey(add)\
            .filter(lambda (k,v): v > self.min_df)

错误出现在这一行.map(lambda (term, (df, rank)): (term, df))\,这是错误信息:

TypeError: 'int' object is not iterable

这是我打电话给DocumentFrequencies.collect()时得到的:

Out[5]:                                                                         
[(u'fawn', 3),
 (u'1,800', 31),
 (u'clotted', 3),
 (u'comically', 11),
 (u'Adjusting', 3),
 (u'O(log', 6),
 (u'unnecessarily', 15),
 (u'evangelical', 53),
 (u'naturopathic', 3),
 (u'grenadiers', 4),
 (u'stipulate', 4),
 (u'Vikrant', 3),
 (u'fractal', 18),

我不知道究竟是哪个参数导致了错误。我正在使用具有 2 个内核的 python 2.7、8 GB 1600 MHz DDR。这些是 pyspark 配置:

conf = pyspark.SparkConf().setAll([('spark.executor.memory', '8g'),('spark.driver.memory','8g'),('spark.network.timeout','100000000s'),('spark.executor.heartbeatInterval','10000000s'),('spark.driver.maxResultSize','8g'),('spark.driver.cores','2')])

提前致谢,

【问题讨论】:

我不熟悉 Idfs 和 Dfs,但看起来 dfs 变量不是可迭代的。例如,列表和字符串是可以迭代的可迭代对象。请登录dfs 一次,看看你得到了什么。 如错误中所述,您正在传递不可迭代的 int 值。检查输入。 @nightgaunt 我尝试记录它,而我得到的 12:03:54,896|INFO|text|PythonRDD[32] at RDD at PythonRDD.scala:48 不是很有用。知道如何打印实际输出吗? 如果 dfs 是 RDD,那么 map 应该可以工作。您可以尝试dfs.collect() 并登录。您还可以添加完整的跟踪吗?现在我感觉它可能不是发生错误的地方 @nightgaunt 但如果我将 api 方法编辑为 .map(lambda (term, df): (term,df)) 不会使这条线没用吗?我也不知道rank 值应该来自哪里?如图所示dfs 只产生termdf 【参考方案1】:

基于DocumentFrequencies.collect() 输出,

map(lambda (term, (df,rank)): (term, df))

不应该存在。基本上它试图将给定的元组(u'fawn', 3) 转换为两部分。 u'fawn' 映射到 term3 映射到 (df,rank)。由于整数 3 不能转换为元组(可迭代),所以报错信息

TypeError: 'int' object is not iterable

删除此行不会更改 dfs 中的任何内容。

【讨论】:

你能不能也看看这个问题:) ***.com/questions/50390255/…

以上是关于导致 TypeError 的 Lambda 函数:“int”对象不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

node-lambda - TypeError:处理程序不是函数

lambda and TypeError:'模块'对象不可调用[重复]

Javascript/ExtJS:Ext.getCmp('') 导致 TypeError ...不是函数

Angular 2 从 Jquery 调用 Typescript 函数会导致未捕获的 TypeError

Stripe PaymentIntent.create 导致 TypeError:无法读取未定义的属性“创建”(谷歌云函数)

lambda在绑定槽函数时的应用