Отображать только 1 элемент, когда это повторение - PullRequest
2 голосов
/ 10 апреля 2020

Я хотел бы напечатать результат без дубликатов с моим умножением

Вот пример:


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

Спасибо за чтение

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Сравнение:

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.reduce и operator.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
1 голос
/ 10 апреля 2020

Что-то подобное с 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)

DEMO: https://rextester.com/QKV22875

0 голосов
/ 10 апреля 2020

Со следующим списком:

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

(Обратите внимание, что список уже есть что-то в 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']

Is это то, что вы хотите?

...