Попытка найти список с меньшим количеством элементов - PullRequest
2 голосов
/ 31 января 2012

Я новичок в Python и программировании в целом.Моя проблема касается операций, с помощью которых я мог найти список с наименьшим количеством элементов в словаре.Чтобы было ясно, у меня есть словарь с десятью ключами, и каждый ключ представляет собой список с большим количеством элементов.Мне нужно перебрать список с наименьшим количеством элементов.Чтобы найти его, я попытался определить функцию, которая выполняет эту работу:

def minlist(*lists):
smallest = min(len(lists))
if len(lists) == smallest:
    return lists

Но ответ был TypeError: 'int' object is not iterable.Как я могу справиться с этим, учитывая, что в принципе я не знаю количества ключей?Вот образец моего словаря (по необходимости)

{97: [1007928679693166, 1007928798219684, 1007928814680980, 1007928891466688, 1007928897515544, 1007928997487142], 98: [1007928837651593, 1007928889730933], 99: [1007928797944536, 1007928805518205, 1007928870847877, 1007929012532919, 1007929030905896, 1007929097107140], 688: [1007928628309796, 1007928724910684, 1007928808626541, 1007928866265101, 1007928908312998, 1007928982161920, 1007929013746703, 1007929055652413], 734: [1007928687611100, 1007928923969018, 1007928933749030, 1007928942892766, 1007929021773704], 1764: [1007928765771998, 1007928917743164], 1765: [1007928894040229, 1007929021413611], 1773: [1007929003959617]}

Ответы [ 3 ]

2 голосов
/ 31 января 2012

вот еще более короткая версия, использующая понимание списка:

min_list=min([len(ls) for ls in dict.values()])

edit: это также можно использовать с использованием генерации (заключать выражение в круглые скобки вместо квадратных) дляболее эффективная версия

1 голос
/ 31 января 2012

Вот решение, использующее промежуточный список кортежей для легкой сортировки / доступа:

input_dict = {1: [1,2,3,4], 2: [2,3,4], 3:[1,2,3]}
#Get key/length(list) type tuples
helper = [(key, len(input_dict[key])) for key in input_dict.keys()]
#Sort list by the second element of the tuple(the length of the list) 
helper.sort(key=lambda x: x[1])

#Now the first position hold the key to the shortest list from the dicitonary and the length
print input_dict[helper[0][0]]
1 голос
/ 31 января 2012

Полагаю, вы хотите сделать это:

def minlist(lists_dict):
  min_list = None
  for list in lists_dict.values():
    if min_list == None: 
      min_list = list
    else:
      if len(list) < len(min_list):
        min_list = list

    return min_list

Почему lists_dict.values()? По умолчанию вы перебираете ключи словаря. Но ты хочешь проверить длина связанных значений => поэтому вы должны использовать их.

Предполагаемая структура словаря выглядит следующим образом:

# { int: list, int: list, ...}
# e.g.:
lists_dict = {1: [2,3], 2: [2,3,4,5], 3: [1], 4: [1,2,2]}

Структура, которую вы описали:

# { list: list, list: list, ...}

не будет работать, вы не можете использовать стандартный список в качестве ключа для словаря.

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