Несортированный числовой список создает неправильный вывод в расчете гистограммы - PullRequest
0 голосов
/ 16 ноября 2011

Я делаю функцию, которая создаст список, который включает гистограмму запрошенного списка и запрошенные значения для использования в качестве значений гистограммы.Значения выше запрошенного значения включаются последними.

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

def histogram(sample, binBoundaries):
    c=0
    if not binBoundaries:
        li = [len(sample)]
        return print(li)
    for x in sample:
        if x > binBoundaries[-1]: #if the value is greater than last bin
            c = c+1            #number of values greater increases
    for eachbin in binBoundaries: #for each bin
        dic[eachbin] = 0          #initial value = 0 to account for no number
        for x in sample:          #for each value wanted to calculate for
            if x <= eachbin:       #if the number falls into the bin
                dic[eachbin] += 1 #the number of values in the bin increases
            sample.remove(x)
    for i in dic:
        listofvalues.append(dic[i])
    listofvalues.append(c)
    print(listofvalues)

гистограмма ([5, 4, 2, 3], [3])

это приведет к выводу [1, 2], где действительноевывод должен быть [2,2]

Есть что-то, чего я просто не вижу, что делает число не рассчитанным?Дай мне знать, где я ошибся, если сможешь!

1 Ответ

1 голос
/ 16 ноября 2011

Ваша проблема в том, что вы удаляете элементы из списка sample во время итерации по нему, это плохая идея, потому что это приведет к пропуску некоторых элементов.

Попробуйте вывести строку sample.remove(x), вы должны получить ожидаемый результат. Если вам действительно нужно удалить элементы из списка ввода, вы должны провести рефакторинг, чтобы убедиться, что вы все еще проверяете каждый элемент в списке. Один из вариантов - перебрать список в обратном порядке, используя for x in reversed(sample).

Похоже, что вы удаляете элементы не в том месте, sample.remove(x) похоже, что оно должно быть внутри if прямо над ним. Попробуйте следующий код:

    ...
    for eachbin in binBoundaries: #for each bin
        dic[eachbin] = 0          #initial value = 0 to account for no number
        for x in reversed(sample):          #for each value wanted to calculate for
            if x <= eachbin:       #if the number falls into the bin
                dic[eachbin] += 1 #the number of values in the bin increases
                sample.remove(x)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...