2016-04-11 2 views
0
def find_duplicates(inputList, occurrences, errorMessage): 
    '''find_duplicates(inputList, occurrences) -> Finds and returns all duplicates in list l 
    which occur at least 'occurrences' times 
    If none are found then errorMessage is returned''' 
    curr = 0 
    prev = 0 
    occurrencesFound = 0 
    duplesFound = [] 
    inputList = sorted(inputList) 
    print(inputList) 
    for i in range(len(inputList)): 
     prev = curr 
     curr = inputList[i] 
     occurrencesFound[curr] = 0 
     if curr == prev and duplesFound.count(curr) == 0: 
      occurrencesFound[curr] += 1 
      if occurrencesFound[curr] == occurrences: 
       duplesFound.append(curr) 
       occurrencesFound = 0 
    if duplesFound == []: 
     duplesFound = errorMessage 
    return duplesFound 

Это код Python 3, который я написал, чтобы вернуть все значения в списке, которые встречаются «вхождения», и отображать выбранное сообщение об ошибке, если их не было найдено , Тем не менее, это то, что я получаю:ТипError: объект 'int' не поддерживает назначение элемента 7

Traceback (most recent call last): 
    File "C:\Python\Python Homework.py", line 68, in <module> 
    print(find_trivial_taxicab_numbers(3)) 
    File "C:\Python\Python Homework.py", line 56, in find_trivial_taxicab_numbers 
    while find_duplicates(intsFound, (n), "Error") == "Error": 
    File "C:\Python\Python Homework.py", line 32, in find_duplicates 
occurrencesFound[curr] = 0 
TypeError: 'int' object does not support item assignment 

я могу сказать, что несколько ошибка, но я не уверен. То, что я пытаюсь сделать, состоит в том, чтобы иметь отдельное количество вхождений для каждого другого значения в списке. Например, если у меня был список [2,2,5,7,7,7,7,8,8,8], я бы хотел, чтобы событияFound [2] заканчивались как 2 ,хожденияFound [5] заканчивались как 1 ,хожденияFound [7] заканчиваются как 4 и так далее.

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

Что я хотел бы знать, почему это ошибка и как я могу ее исправить. Вместо этого я попытался выполнить записиFound (curr), и это не сработало. Ответ был дан в "TypeError: 'function' object does not support item assignment". Есть идеи?

+1

Я думаю, что вы хотите сделать 'occurrencesFound = []', а не 'occurrencesFound = 0'.Или, может быть, даже 'occencesFound = {}', если вам нужен словарь. – idjaw

+0

Почему вы устанавливаете 'occencesFound' в int? – user2357112

+0

'entryencesFound' - значение int, поэтому 'хожденияFound [curr]' не имеет смысла –

ответ

0

Вы occurancesFound установлен в целочисленный тип данных в этой строке:

occurrencesFound = 0 

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

Если вы хотите назначить в нее элементы, сделать его Dict:

occurancesFound = {} 
0

Вы устанавливаете occurrencesFound к междунар (0), а затем пытается использовать его в виде списка (occurrencesFound[curr] = 0). Это проблема. Если вы хотите сохранить вхождений различных субъектов в occurrencesFound, использовать его следующим образом:

occurrencesFound = {} 
occurrencesFound[curr] = 0 

Это позволит создать словарь COUNT (ИНТ) переменных, где curr является ключевым.

0

Как уже упоминалось, в вашем коде есть серьезная несогласованность: вы пытаетесь использовать occurrencesFound как целое число, так и список.

Простым способом поиска групп дублирующих элементов в списке является использование стандартной функции модуля itertools.groupby. Ваш find_duplicates принимает аргумент errorMessage, но я советую, чтобы обработать ошибку в вызывающем коде было проще, чем в функции, которая находит группы.

Моего find_duplicates собирает группы в dict, который является более гибким, что использование list, так как он может быть использован для различных типов элементов, а не только целых чисел. И даже если вы просто собираете группы целых чисел, dict по-прежнему лучше, чем list, если только эти целые числа не будут приблизительно смежными, с самым низким целым рядом с нулем (и неотрицательным).

from itertools import groupby 

def find_duplicates(input_list, occurrences=2): 
    input_list = sorted(input_list) 
    groups = {} 
    for k, g in groupby(input_list): 
     # We have to convert iterator `g` to a list to get its length 
     glen = len(list(g)) 
     if glen >= occurrences: 
      groups[k] = glen 
    return groups 

# Test 
input_list = [7, 8, 7, 2, 8, 5, 7, 7, 8, 2] 

groups = find_duplicates(input_list, 3) 
if not groups: 
    print('No groups found') 
else: 
    print(groups) 

выход

{8: 3, 7: 4} 
Смежные вопросы