【问题标题】:Use list comprehension to replace specific values in list of tuples使用列表推导替换元组列表中的特定值
【发布时间】:2020-10-16 07:47:34
【问题描述】:

我有一个像这样的浮点元组列表:

my_list = [(1.1, 6.6, 3.3), (4.4, 5.5, 9.9)]

但是,我需要为我的值设置一个限制,这样任何元组中的值都不会超过限制。为了这个例子,假设limit = 6.

我正在寻找一个简单的列表理解解决方案,但到目前为止我所尝试的一切都失败了。

例如: new_list = [ y for x in my_list if y <= limit for y in x ]

导致“UnboundLocalError: local variable 'y' referenced before assignment”。

使用嵌套的 for 循环我可以找到解决方案:

my_new_list = []                                                                                                     

for my_tuple in my_list:  
    new_tuple = [] 
    for i, value in enumerate(my_tuple): 
        if value > limit: 
            value = limit 
        new_tuple.append(value) 
     my_new_list.append(new_tuple)

但我正在寻找一个简单的列表理解解决方案。

编辑:这已经解决了,但是为了澄清,由于问题存在一些歧义,我希望保持列表的形式相同,并用该限制替换任何超过限制的值。这是我正在寻找的输出:[(1.1, 6., 3.3), (4.4, 5.5, 6.)]

【问题讨论】:

    标签: python list tuples list-comprehension


    【解决方案1】:

    我想这就是您要找的东西?这会重现与输入相同的格式,只是将所有值限制在限制范围内。

    [tuple(min(i, limit) for i in t) for t in my_list]
    

    【讨论】:

    • 是的!这正是我想要的。谢谢!
    【解决方案2】:

    检查这只是代码中的一点点变化

    limit=6

    my_list = [(1.1, 6.6, 3.3), (4.4, 5.5, 9.9)]

    [y for x in my_list for y in x if y<=limit ]

    【讨论】:

    • 这是过滤掉超出限制的值的好方法。我认为事实上,问题是根据 OP 的代码将它们设置为限制而不是删除它们,尽管它们的描述有点模棱两可。
    【解决方案3】:

    您要求列表解析,因此您只需在列表解析内循环元组,对值进行内部循环,并使用min

    my_list = [(1.1, 6.6, 3.3), (4.4, 5.5, 9.9)]
    limit = 6.
    
    print([tuple(min(v, limit) for v in t) for t in my_list])
    

    这给出了:

    [(1.1, 6., 3.3), (4.4, 5.5, 6.)]
    

    实际上内部循环是生成器推导的形式,但tuple() 将对其进行迭代并将其转换为元组。

    显然这会创建新的元组而不是尝试修改现有的元组,因为元组是不可变的。

    【讨论】:

      猜你喜欢
      • 2020-06-03
      • 2021-08-19
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2019-02-18
      • 2018-12-22
      相关资源
      最近更新 更多