【问题标题】:Display only 1 element when it's a repetition重复时仅显示 1 个元素
【发布时间】:2020-04-10 12:59:12
【问题描述】:

我想用我的乘法打印一个不重复的结果

这里是一个例子:


5*3*2=30
2*3*5=30
5*2*3=30
3*2*5=30
.....

所有这些元素都来自我浏览的列表,你可以看到它总是 =30

所以我想只显示第一个元素 (5*3*2) 而不是其他元素,因为它们是相同的。

为了更准确,这里有一个例子:

list = ['5*3*2','5*2*3','2*3*5','2*5*3']

for i in list:       
     if eval(i) == eval(i)+1 ??? (I dont know how to say the next element)
            print(eval(i))

感谢阅读

【问题讨论】:

  • eval(i) 等于 30 但eval(i)+1 等于 31。当然这不是你的意思。

标签: python list inverse


【解决方案1】:

not in 这样的东西会帮助你。

#python 3.5.2
list = ['5*3*2','5*2*3','6*9','2*3*5','2*5*3','8*3','9*6']
elm = []
for i in list:   
    elm_value = eval(i)
    if elm_value not in elm:
        elm.append(elm_value)
print(elm)

演示: https://rextester.com/QKV22875

【讨论】:

    【解决方案2】:

    对比:

    eval(i) == eval(i)+1 
    

    将比较数字i 是否等于i + 1,这将始终返回False。我确定您的意思是使用 i 作为索引,并且只是想比较当前元素是否等于列表中的下一个元素。但是,这样做并不能真正跟踪重复项,因为您必须考虑列表中的所有其他内容。

    使用list 作为变量名也不是一个好主意,因为它会影响内置函数list。您可以使用许多其他合适的名称。

    一种方法是使用集合来跟踪您看到的项目,并且只打印您第一次看到的项目:

    lst = ["5*3*2","5*2*3","2*3*5","2*5*3"]
    
    seen = set()
    for exp in lst:
        calc = eval(exp)
        if calc not in seen:
            print(calc)
            seen.add(calc)
    

    如果您总是使用* 运算符(无括号)处理简单的乘法表达式,您也可以使用functools.reduceoperator.mul 来代替此处的eval 来将数字相乘。这将首先将数字拆分为*,将每个数字字符串映射到一个整数,然后将每个元素相乘。

    from operator import mul
    from functools import reduce
    
    lst = ["5*3*2","5*2*3","2*3*5","2*5*3"]
    
    seen = set()
    for exp in lst:
        numbers =  map(int, exp.split("*"))
        calc = reduce(mul, numbers)
        if calc not in seen:
            print(calc)
            seen.add(calc)
    

    输出:

    30
    

    【讨论】:

      【解决方案3】:

      有以下列表:

      l = ['5*3*2','5*2*3','2*3*5','2*5*3', '2*2']
      

      (注意 list 已经是 python 中的东西了,所以我不建议使用它作为变量名)

      我将首先创建一个唯一值列表:

      unique_vals = set(map(eval, list))
      set([4, 30])
      

      然后为每个唯一值获取 l 中的第一个匹配项:

      [next(x for x in l if eval(x) ==  i) for i in unique_vals]
      

      我明白了:

      ['2*2', '5*3*2']
      

      这是你想要的吗?

      【讨论】:

      • 嗯,不是真的,我的列表中的所有数字组合都带有括号,例如 (3+2)*5 或 (2+3)*5 或 5*(3+2) 或5*(2+3) 但你看到这是相同的结果,所以我想在这里只打印 4 个元素中的 1 个
      • 这不是我显示的输出吗?或者你想要 30 作为输出?我刚刚添加了 2*2 来表明如果你有一个额外的元素它仍然可以工作。如果你只想要 30 个,你可以停在 unique_vals
      • 是的,我明白,但我不想要只有 1 个值,因为例如如果我想要 10,我可以做 (5*2) 或 5+2+3,我需要 2结果不同,我想要的是更多地删除运算符的交换性!
      • 哈,我明白了!例如。如果你有 10 的 2 * (2 + 3),你也想保留它,但你不想要 2 * (3 + 2)。有趣的例子 :) 如果不写下很多定义 a == b 的规则,我不确定如何做到这一点(但如果我要这样做,我可能会编写一个类并在 _eq_ 并(几乎)执行我显示的确切代码)。我会关注这篇文章的!
      • 是的!我正在尝试,我想我只用 (2*3*5)=(5*3*2) 之类的乘法来做到这一点......我也用 + 做过,但我不知道当我怎么做在相同的操作中有“+”和“*”和“/”......非常感谢!
      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多