Pierre
Pierre

Reputation: 41

Display only 1 element when it's a repetition

I would like print a result without duplicate with my multiplication

Here an example :


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

All these element are from my list that I browse and you can see it's always =30

So I would like display only the first element (5*3*2) and not others because they are the same.

To be more accurate, here an example what I have :

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))

Thanks for reading

Upvotes: 2

Views: 361

Answers (3)

Gabriel Trégoat
Gabriel Trégoat

Reputation: 81

With the following list:

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

(Note that list is already something in python so I wouldn't recommend using that as a variable name)

I would first create a list of unique values:

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

Then for each unique values get the first match in l:

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

I get:

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

Is that what you want?

Upvotes: 0

RoadRunner
RoadRunner

Reputation: 26315

The comparison:

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

Will compare if the the number i is equal to i + 1, which will always return False. I'm sure you mean to use i as an index and simply wanted to compare if the current element is equal to the next element in the list. However, doing this doesn't really keep track of duplicates, since you have to consider everything else in the list.

Its also not a good idea to use list as a variable name, since it shadows the builtin function list. Plenty of other suitable names you can use.

One way is to use a set to keep track of what items you have seen, and only print items that you have seen for the first time:

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)

If you are always dealing with simple multiplying expressions with the * operator(no brackets), you could also use functools.reduce and operator.mul instead to multiply the numbers instead of eval here. This will first split the numbers by *, map each number string to an integer, then multiply every element with each other.

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)

Output:

30

Upvotes: 1

A l w a y s S u n n y
A l w a y s S u n n y

Reputation: 38502

Something like this with not in will help you.

#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)

DEMO: https://rextester.com/QKV22875

Upvotes: 1

Related Questions