Python: функция для группировки номера по десяткам - PullRequest
0 голосов
/ 16 января 2019

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

например:

$ group_by_10s([1, 10, 15, 20])
[[1], [10, 15], [20]]
$ group_by_10s([8, 12, 3, 17, 19, 24, 35, 50])
[[3, 8], [12, 17, 19], [24], [35], [], [50]]

мой подход:

limiting = 10
ex_limiting = 0
result = []
for num in lst:
    row = []
    for num in lst:
        if num >= ex_limiting and num <= limiting:
            row.append(num)
            lst.remove(num)
    result.append(row)
    ex_limiting = limiting
    limiting += 10

Но он возвращает [[1], [10, 20]]. Что не так с моим подходом и как я могу это исправить?

Ответы [ 5 ]

0 голосов
/ 16 января 2019

Как насчет этого?

numbers = [8, 12, 3, 17, 19, 24, 35, 50]


def group_by_10s(numbers):
    arr = []
    for i in range((max(numbers) / 10) + 1):
        arr.append([])

    numbers.sort()

    for number in numbers:
        if number < 10:
            arr[0].append(number)
        else:
            index = number / 10
            arr[index].append(number)

    return arr


print group_by_10s(numbers)
# [[3, 8], [12, 17, 19], [24], [35], [], [50]]
0 голосов
/ 16 января 2019

Благодарю за совет не повторять список во время цикла. Я получил этот ответ в конце, для тех, кто хочет получить ответ. Спасибо за поддержку!

def group_by_10s(numbers):
  external_loop = int(max(numbers)/10)
  limiting = 10
  ex_limiting = 0
  result = []
  for external_loop_count in range(external_loop+1):
    row = []
    for num in numbers:
        if num >= ex_limiting and num < limiting:
            row.append(num)
            row.sort()
    result.append(row)
    ex_limiting = limiting
    limiting += 10
  return(result)
0 голосов
/ 16 января 2019

Вы можете использовать понимание списка:

def group_by_10s(_d):
  d = sorted(_d)
  return [[c for c in d if c//10 == i] for i in range(min(_d)//10, (max(_d)//10)+1)]

print(group_by_10s([1, 10, 15, 20]))
print(group_by_10s([8, 12, 3, 17, 19, 24, 35, 50]))
print(group_by_10s(list(range(20))))

Выход:

[[1], [10, 15], [20]]
[[3, 8], [12, 17, 19], [24], [35], [], [50]]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]]
0 голосов
/ 16 января 2019

Возможно, у вас уже есть правильный ответ, но вот альтернативное решение:

def group_by_10s(mylist):
    result = []
    decade = -1
    for i in sorted(mylist):
        while i // 10 != decade:
            result.append([])
            decade += 1
        result[-1].append(i)
    return result

group_by_10s([8, 12, 3, 17, 19, 24, 35, 50])
#[[3, 8], [12, 17, 19], [24], [35], [], [50]]

Используется только простой Python, без дополнительных модулей.

0 голосов
/ 16 января 2019

Не изменяйте список во время итерации по нему, так как при удалении элементов из него некоторые элементы пропускаются. Также измените границы так, чтобы вы добавляли только к row, если num < limiting. Я бы добавил в проверку, чтобы убедиться, что список содержит элементы, прежде чем добавить его к result:

for num in lst:
    row = []
    for num in lst:
         if num >= ex_limiting and num < limiting:
             row.append(num)
    if len(row) > 0 :
        result.append(row)
    ex_limiting = limiting
    limiting += 10

Это даст:

[[1], [10, 15], [20]]
...