Как найти список, который содержит более высокое значение из вложенного списка, и вернуть эти списки? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть этот вложенный список, который содержит повторяющиеся записи:

[['Coloring book moana', 'ART_AND_DESIGN', '3.9', 967, '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up'],
 ['Coloring book moana', 'FAMILY', '3.9', 974, '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up'],
 ['Gmail', 'COMMUNICATION', '4.3', 4604324, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Everyone', 'Communication', 'August 2, 2018', 'Varies with device', 'Varies with device'],
 ['Gmail', 'COMMUNICATION', '4.3', 4604483, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Everyone', 'Communication', 'August 2, 2018', 'Varies with device', 'Varies with device'],
 ['Instagram', 'SOCIAL', '4.5', 66577313, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'],
 ['Instagram', 'SOCIAL', '4.5', 66577446, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'],
 ['Instagram', 'SOCIAL', '4.5', 66509917, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']]

Я хочу отфильтровать вложенный список по i [3], чтобы окончательный результат был таким

[['Gmail', 'COMMUNICATION', '4.3', 4604483, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Everyone', 'Communication', 'August 2, 2018', 'Varies with device', 'Varies with device'],
 ['Coloring book moana', 'FAMILY', '3.9', 974, '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up'],
 ['Instagram', 'SOCIAL', '4.5', 66577446, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']]

Я пробовал для l oop, но не могу понять, как получить максимальное значение повторяющихся списков

Ответы [ 3 ]

2 голосов
/ 10 июля 2020

Вот самый питонский c способ, который я мог придумать. Мой подход состоит в том, чтобы сначала отсортировать список списков по sublist[3], что означает, что при обходе списка мы в конечном итоге встретим подсписок с максимальным количеством проверок до того, как встретим его дубликат. Этот трюк будет использоваться для создания окончательного списка.

meta_list = [['Coloring book moana', 'ART_AND_DESIGN', '3.9', 967, '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up'],
 ['Coloring book moana', 'FAMILY', '3.9', 974, '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up'],
 ['Gmail', 'COMMUNICATION', '4.3', 4604324, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Everyone', 'Communication', 'August 2, 2018', 'Varies with device', 'Varies with device'],
 ['Gmail', 'COMMUNICATION', '4.3', 4604483, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Everyone', 'Communication', 'August 2, 2018', 'Varies with device', 'Varies with device'],
 ['Instagram', 'SOCIAL', '4.5', 66577313, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'],
 ['Instagram', 'SOCIAL', '4.5', 66577446, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'],
 ['Instagram', 'SOCIAL', '4.5', 66509917, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']]

# Sort the list by review count and review name - make sure the highest review is first
meta_list.sort(key=lambda x: (int(x[3]), x[0]), reverse=True)

# This is the list we'll use to store the final data in
final_list = []
# Go through all the items in the meta_list
for meta in meta_list:
    
    if not meta[0] in [item[0] for item in final_list]:
        '''
        If another meta with the same name (0th index)
        doesn't already exist in final_list, add it
        '''
        final_list.append(meta)

Output-

[['Instagram',
  'SOCIAL',
  '4.5',
  66577446,
  'Varies with device',
  '1,000,000,000+',
  'Free',
  '0',
  'Teen',
  'Social',
  'July 31, 2018',
  'Varies with device',
  'Varies with device'],
 ['Gmail',
  'COMMUNICATION',
  '4.3',
  4604483,
  'Varies with device',
  '1,000,000,000+',
  'Free',
  '0',
  'Everyone',
  'Communication',
  'August 2, 2018',
  'Varies with device',
  'Varies with device'],
 ['Coloring book moana',
  'FAMILY',
  '3.9',
  974,
  '14M',
  '500,000+',
  'Free',
  '0',
  'Everyone',
  'Art & Design;Pretend Play',
  'January 15, 2018',
  '2.0.0',
  '4.0.3 and up']]

В основном он добавляет все мета, которые еще не существуют, в final_list. Почему это работает? Потому что первая мета , с которой вы сталкиваетесь во время цикла, - это с наибольшим количеством просмотров . Итак, как только этот будет добавлен, его дубликаты не могут быть добавлены, и мы закончили.

Примечание : это не сохранит порядок самих обзоров. Он только гарантирует, что будут сохранены только отзывы с наибольшим количеством рецензий, на случай, если есть дубли с таким же именем.

1 голос
/ 10 июля 2020

Вероятно, существует более элегантное / pythoni c решение этой проблемы, но вот один из возможных путей:

my_list = [...] # Nested list here

def compare_duplicates(nested_list, name_index=0, compare_index=3):
    max_values = dict() # Used two dictionaries for readability
    final_indexes = dict()

    for i, item in enumerate(nested_list):
        name, value = item[name_index], item[compare_index]

        if value > max_values.get(name, 0):
            max_values[name] = value
            final_indexes[name] = i

    return [nested_list[i] for i in final_indexes.values()]

print(compare_duplicates(my_list))
0 голосов
/ 10 июля 2020

Примерно так:

_DATA = [
    ['Coloring book moana', 'ART_AND_DESIGN', '3.9', 967, '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up'],
    ['Coloring book moana', 'ART_AND_DESIGN', '3.9', 974, '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up'],
    ['Gmail', 'COMMUNICATION', '4.3', 4604324, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Everyone', 'Communication', 'August 2, 2018', 'Varies with device', 'Varies with device'],
    ['Gmail', 'COMMUNICATION', '4.3', 4604483, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Everyone', 'Communication', 'August 2, 2018', 'Varies with device', 'Varies with device'],
    ['Instagram', 'SOCIAL', '4.5', 66577313, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'],
    ['Instagram', 'SOCIAL', '4.5', 66577446, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'],
    ['Instagram', 'SOCIAL', '4.5', 66509917, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']
]


def print_highest(data):
    list_map = {}
    for d in data:
        key = str(d[0:3] + d[4:])
        if key not in list_map:
            list_map[key] = d
            continue

        if d[3] > list_map[key][3]:
            list_map[key] = d

    for l in list_map.values():
        print(l)


print_highest(_DATA)

Вывод:

['Coloring book moana', 'ART_AND_DESIGN', '3.9', 974, '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up']
['Gmail', 'COMMUNICATION', '4.3', 4604483, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Everyone', 'Communication', 'August 2, 2018', 'Varies with device', 'Varies with device']
['Instagram', 'SOCIAL', '4.5', 66577446, 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']
...