Python 按数字和将整数列表排序为列表列表
我正在尝试编写一个Python函数,将一个数字列表排序为一个数字列表,每个子列表只包含具有较大列表中子列表索引的数字和的数字 因此,例如,对于从1到25的所有数字,它应该产生如下列表:Python 按数字和将整数列表排序为列表列表,python,list,number-theory,Python,List,Number Theory,我正在尝试编写一个Python函数,将一个数字列表排序为一个数字列表,每个子列表只包含具有较大列表中子列表索引的数字和的数字 因此,例如,对于从1到25的所有数字,它应该产生如下列表: [[], [1, 10], [2, 11, 20], [3, 12, 21], [4, 13, 22], [5, 14, 23], [6, 15, 24], [7, 16], [8, 17], [9, 18], [19]] 到目前为止,我有以下代码: def digit_sum(integer_data_typ
[[], [1, 10], [2, 11, 20], [3, 12, 21], [4, 13, 22], [5, 14, 23], [6, 15, 24], [7, 16], [8, 17], [9, 18], [19]]
到目前为止,我有以下代码:
def digit_sum(integer_data_type):
int_string = str(integer_data_type)
sum = 0
for digits in int_string:
sum += int(digits)
return sum
def organize_by_digit_sum(integer_list):
integer_list.sort()
max_ds = 9*len(str(max(integer_list)))+1
list_of_lists = []
current_ds = 0
while current_ds <= max_ds:
current_list = []
for n in integer_list:
if digit_sum(n) == current_ds:
current_list.append(n)
list_of_lists.append(current_list)
current_ds += 1
return list_of_lists
def数字和(整数数据类型):
int\u string=str(整型数据类型)
总和=0
对于int_字符串中的数字:
总和+=整数(位数)
回报金额
def按数字和组织(整数列表):
整数_list.sort()
max_ds=9*len(str(max(整数列表))+1
列表中的列表=[]
当前\u ds=0
如果您不介意使用itertools
,那么当前的方法应该更有效
from itertools import groupby
digit_sum = lambda x: sum(int(i) for i in str(x))
[list(g) for _, g in groupby(sorted(range(1,26), key = digit_sum), key = digit_sum)]
# ^^^^^^^^^^ replace this with your actual data
# [[1, 10],
# [2, 11, 20],
# [3, 12, 21],
# [4, 13, 22],
# [5, 14, 23],
# [6, 15, 24],
# [7, 16, 25],
# [8, 17],
# [9, 18],
# [19]]
这里的工作方式是:使用sorted()
按整数的位数和对原始列表进行排序,这样您就可以使用groupby()
方法按位数和对列表进行分组,然后循环分组,并将每组中的整数转换为列表
更新:
要获取子列表的位数和等于索引的列表,可以首先创建字典:
dict_ = dict((k,list(g)) for k, g in groupby(sorted(range(1,26), key = digit_sum), key = digit_sum))
dict_
# {1: [1, 10],
# 2: [2, 11, 20],
# 3: [3, 12, 21],
# 4: [4, 13, 22],
# 5: [5, 14, 23],
# 6: [6, 15, 24],
# 7: [7, 16, 25],
# 8: [8, 17],
# 9: [9, 18],
# 10: [19]}
[dict_.get(key, []) for key in range(max(dict_.keys()))]
# [[],
# [1, 10],
# [2, 11, 20],
# [3, 12, 21],
# [4, 13, 22],
# [5, 14, 23],
# [6, 15, 24],
# [7, 16, 25],
# [8, 17],
# [9, 18]]
如果您不介意使用itertools
,这里有一种更有效的方法
from itertools import groupby
digit_sum = lambda x: sum(int(i) for i in str(x))
[list(g) for _, g in groupby(sorted(range(1,26), key = digit_sum), key = digit_sum)]
# ^^^^^^^^^^ replace this with your actual data
# [[1, 10],
# [2, 11, 20],
# [3, 12, 21],
# [4, 13, 22],
# [5, 14, 23],
# [6, 15, 24],
# [7, 16, 25],
# [8, 17],
# [9, 18],
# [19]]
这里的工作方式是:使用sorted()
按整数的位数和对原始列表进行排序,这样您就可以使用groupby()
方法按位数和对列表进行分组,然后循环分组,并将每组中的整数转换为列表
更新:
要获取子列表的位数和等于索引的列表,可以首先创建字典:
dict_ = dict((k,list(g)) for k, g in groupby(sorted(range(1,26), key = digit_sum), key = digit_sum))
dict_
# {1: [1, 10],
# 2: [2, 11, 20],
# 3: [3, 12, 21],
# 4: [4, 13, 22],
# 5: [5, 14, 23],
# 6: [6, 15, 24],
# 7: [7, 16, 25],
# 8: [8, 17],
# 9: [9, 18],
# 10: [19]}
[dict_.get(key, []) for key in range(max(dict_.keys()))]
# [[],
# [1, 10],
# [2, 11, 20],
# [3, 12, 21],
# [4, 13, 22],
# [5, 14, 23],
# [6, 15, 24],
# [7, 16, 25],
# [8, 17],
# [9, 18]]
如果您想要一个留下空列表的解决方案,并且空间效率不是您主要关心的问题,我将使用元组列表:
>>> def digit_sum(digits):
... total = 0
... while digits != 0:
... total += digits % 10
... digits = digits // 10
... return total
...
>>> numbers = list(range(1,26))
>>> pairs = sorted((digit_sum(n),n) for n in numbers)
>>> pairs
[(1, 1), (1, 10), (2, 2), (2, 11), (2, 20), (3, 3), (3, 12), (3, 21), (4, 4), (4, 13), (4, 22), (5, 5), (5, 14), (5, 23), (6, 6), (6, 15), (6, 24), (7, 7), (7, 16), (7, 25), (8, 8), (8, 17), (9, 9), (9, 18), (10, 19)]
>>> maximum_sum = pairs[-1][0]
>>> list_of_lists = [[] for _ in range(maximum_sum+1)]
>>> for pair in pairs:
... list_of_lists[pair[0]].append(pair[1])
...
>>> list_of_lists
[[], [1, 10], [2, 11, 20], [3, 12, 21], [4, 13, 22], [5, 14, 23], [6, 15, 24], [7, 16, 25], [8, 17], [9, 18], [19]]
>>>
因此,假设您的数据要稀疏得多:
>>> numbers = [4,25,47,89]
>>> pairs = sorted((digit_sum(n),n) for n in numbers)
>>> pairs
[(4, 4), (7, 25), (11, 47), (17, 89)]
>>> maximum_sum = pairs[-1][0]
>>> list_of_lists = [[] for _ in range(maximum_sum+1)]
>>> for pair in pairs:
... list_of_lists[pair[0]].append(pair[1])
...
>>> from pprint import pprint
>>> pprint(list_of_lists,width=2)
[[],
[],
[],
[],
[4],
[],
[],
[25],
[],
[],
[],
[47],
[],
[],
[],
[],
[],
[89]]
>>>
您可以访问您的数据,例如:
>>> list_of_lists[17]
[89]
>>> list_of_lists[8]
[]
>>>
如果您想要一个留下空列表的解决方案,并且空间效率不是您主要关心的问题,我将使用元组列表:
>>> def digit_sum(digits):
... total = 0
... while digits != 0:
... total += digits % 10
... digits = digits // 10
... return total
...
>>> numbers = list(range(1,26))
>>> pairs = sorted((digit_sum(n),n) for n in numbers)
>>> pairs
[(1, 1), (1, 10), (2, 2), (2, 11), (2, 20), (3, 3), (3, 12), (3, 21), (4, 4), (4, 13), (4, 22), (5, 5), (5, 14), (5, 23), (6, 6), (6, 15), (6, 24), (7, 7), (7, 16), (7, 25), (8, 8), (8, 17), (9, 9), (9, 18), (10, 19)]
>>> maximum_sum = pairs[-1][0]
>>> list_of_lists = [[] for _ in range(maximum_sum+1)]
>>> for pair in pairs:
... list_of_lists[pair[0]].append(pair[1])
...
>>> list_of_lists
[[], [1, 10], [2, 11, 20], [3, 12, 21], [4, 13, 22], [5, 14, 23], [6, 15, 24], [7, 16, 25], [8, 17], [9, 18], [19]]
>>>
因此,假设您的数据要稀疏得多:
>>> numbers = [4,25,47,89]
>>> pairs = sorted((digit_sum(n),n) for n in numbers)
>>> pairs
[(4, 4), (7, 25), (11, 47), (17, 89)]
>>> maximum_sum = pairs[-1][0]
>>> list_of_lists = [[] for _ in range(maximum_sum+1)]
>>> for pair in pairs:
... list_of_lists[pair[0]].append(pair[1])
...
>>> from pprint import pprint
>>> pprint(list_of_lists,width=2)
[[],
[],
[],
[],
[4],
[],
[],
[25],
[],
[],
[],
[47],
[],
[],
[],
[],
[],
[89]]
>>>
您可以访问您的数据,例如:
>>> list_of_lists[17]
[89]
>>> list_of_lists[8]
[]
>>>
以下循环仅在数据上循环一次,并返回一个字典,其键为和,值为对应于该和的项:
from collections import defaultdict
from pprint import pprint
def group_by_sum(lst):
d = defaultdict(list)
for i in lst:
d[sum(int(j) for j in str(i))].append(i)
return d
pprint(group_by_sum(range(1, 25)))
# {1: [1, 10],
# 2: [2, 11, 20],
# 3: [3, 12, 21],
# 4: [4, 13, 22],
# 5: [5, 14, 23],
# 6: [6, 15, 24],
# 7: [7, 16],
# 8: [8, 17],
# 9: [9, 18],
# 10: [19]}
您可以根据总和对字典值进行排序,以形成一个列表,但我认为将数据保留为字典可能会更好。以下循环仅在数据上循环一次,并返回一个字典,其键是总和,值是对应于该总和的项:
from collections import defaultdict
from pprint import pprint
def group_by_sum(lst):
d = defaultdict(list)
for i in lst:
d[sum(int(j) for j in str(i))].append(i)
return d
pprint(group_by_sum(range(1, 25)))
# {1: [1, 10],
# 2: [2, 11, 20],
# 3: [3, 12, 21],
# 4: [4, 13, 22],
# 5: [5, 14, 23],
# 6: [6, 15, 24],
# 7: [7, 16],
# 8: [8, 17],
# 9: [9, 18],
# 10: [19]}
您可以根据总和对字典值进行排序,以形成一个列表,但我认为将数据作为字典保存可能会更好。非常简单:
list_of_lists = [[] for i in range(11)]
for i in range(25):
digit_sum = sum(int(i) for i in str(i))
list_of_lists[digit_sum].append(i)
print (list_of_lists)
非常简单:
list_of_lists = [[] for i in range(11)]
for i in range(25):
digit_sum = sum(int(i) for i in str(i))
list_of_lists[digit_sum].append(i)
print (list_of_lists)
这正是询问者想要的吗?我认为这不会将内部列表放置在一个等于其数字和的索引上。取而代之的是,它只是按数字和对它们进行分组和排序。这正是提问者想要的吗?我认为这不会将内部列表放置在一个等于其数字和的索引上。相反,它只是按数字和对它们进行分组和排序。只要出于某种原因不严格要求输出为列表,这是很好的。在没有一堆空列表的情况下有效地完成同样的事情。只要出于某种原因不严格要求输出为列表,这是很好的。在没有一堆空列表的情况下有效地完成同样的事情。