Как я могу получить минимальный товар более эффективно? - PullRequest
0 голосов
/ 13 марта 2019

У меня есть список, состоящий из элементов кортежа, таких как (id, cost, clicks, views), как показано ниже:

statistic_data_list = [(12324, 9, 6, 9), (12325, 11, 5, 3), (12326, 10, 7, 2)] 

И я хочу получить идентификатор предмета, который отвечает следующим условиям:

  • 1, когда не все cost элемента равны 0, получить идентификатор элемента, который cost является самым низким.
  • 2, когда все cost элемента равны 0, тогда, если не все clicks элемента равны 0, получают идентификатор элемента, который clicks является самым низким.
  • 3, когда все clicks элемента равны 0, тогда, если не все views элемента равны 0, получают идентификатор элемента, который views является самым низким.
# (1)
#  input:  
[(12324, 9, 6, 9), (12325, 11, 5, 3), (12326, 10, 7, 2)]
#  expected result: 
12324 # (whose cost is lowest) 

# (2)
#  input:  
[(12324, 0, 6, 9), (12325, 0, 5, 3), (12326, 0, 7, 2)]
#  expected result:
12325 #  (whose clicks is lowest when all cost is 0)

# (3)
#  input:  
[(12324, 0, 0, 9), (12325, 0, 0, 3), (12326, 0, 0, 2)]
#  expected result: 
12326  #  (whose views is lowest when all cost is 0 also clicks)

Как мне получить идентификатор указанного элемента более эффективно?

# My attemp so far

cost_clicks_views_list = [(12324, 9, 6, 9), (12325, 11, 5, 3), (12326, 10, 7, 2)]

len_cost_not_0 = len(list(filter(lambda item: item[1], cost_clicks_views_list)))
len_clicks_not_0 = len(list(filter(lambda item: item[2], cost_clicks_views_list)))
len_views_not_0 = len(list(filter(lambda item: item[3], cost_clicks_views_list)))


if len_cost_not_0:
    min_cost_id_list = [ item[0] for item in cost_clicks_views_list if item[1]==min([i[1] for i in cost_clicks_views_list]) ]
    print(min_cost_id_list) # [(12324]

else:
    if len_clicks_not_0:
        min_clicks_id_list = [item[0] for item in cost_clicks_views_list if item[2] == min([i[2] for i in cost_clicks_views_list])]
        print(min_clicks_id_list) # [(12325]

    else:
        if len_views_not_0:
            min_views_id_list = [item[0] for item in cost_clicks_views_list if item[3] == min([i[3] for i in cost_clicks_views_list])]
            print(min_views_id_list)  # [12326]

Любые комментарии приветствуются. большое спасибо.

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете использовать списки для проверки этих. Когда хотя бы один cost среди всех предметов не равен нулю, чтобы получить id предмета с cost наименьшим, попробуйте это:

sdl = [(12324, 10, 0.6, 9), (12325, 11, 0.5, 3), (12326, 10, 0.7, 2)]
a = [j[0] for j in sdl if j[1]==min([k[1] for k in sdl if all([True if i[1] != 0 else False for i in sdl])])]

ВЫХОД :

a = [12324, 12326]

Здесь все три элемента имеют ненулевое значение cost, а самая низкая стоимость равна 10, в соответствии с которой существуют два идентификатора 12324 и 12326.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...