循环迭代创建新的空列表?

时间:2018-01-18 09:31:22

标签: python

所以如果我更新空列表的名称,我觉得我的代码可以大大缩短,但我不确定我是怎么做到的?这是它经常看起来的样子。该程序的目的是按范围排序。

x=[11,12,21,34,35,36]

list_1020 = []
list_2030 = []
list_3040 = []

for i in x:
  if 10<= i <20:
  list_1020.append[i]

我会复制并粘贴每个列表的for循环。这很好,直到我得到更大的列表,代码在这里节省时间!

因此,如果我可以在每次轻松解决此问题时更新列表名称。这是我到目前为止所得到的。使用与上面相同的'x'列表

min = 10
max = 20
list_ #min+max - THIS IS THE PART I DONT KNOW HOW TO DO = []

for i in x:

  if min<= i <max:
   list_#min+max.append[i]
  else:
   min+=10
   max+=10
   list_ #min+max - THIS IS THE PART I DONT KNOW HOW TO DO = []

从理论上讲,这将是我需要的所有代码(除了更新课程列表名称所需的行之外)。这可能吗?我还是有点新编程所以如果我搞砸到任何地方或者如果你有办法让它变得更好,请告诉我!

6 个答案:

答案 0 :(得分:3)

构建字典,然后您可以根据需要获取它的值

s = {}    
for i in x:
  s.setdefault((i+9)//10*10, []).append(i),
# {40: [34, 35, 36], 20: [11, 12], 30: [21]}

答案 1 :(得分:2)

import collections

x=[11,12,21,34,35,36]

lists = collections.defaultdict(list)

for i in x:
    lower = (i//10) * 10
    upper = lower + 10
    lists[(lower, upper)].append[i]

现在,您的lists变量是一个字典,它将(最小,最大)对映射到该范围内的值列表:

>>> lists[(10, 20)]
[11, 12]

当然你不需要键中的下限和上限 - 你可以只用下限存储它们,因为你知道范围有多宽:     导入集合

x=[11,12,21,34,35,36]

lists = collections.defaultdict(list)

for i in x:
    lower = (i//10) * 10
    lists[lower].append[i]

答案 2 :(得分:1)

如果您想使用dict,这是其中一个解决方案:

x = [11, 12, 21, 35, 36]

bottom = 10
top = 10

ceiling = int(round(max(x), -1))

solution = {}

while top <= ceiling:
    solution['list_{}{}'.format(bottom, top)] = [i for i in x if bottom <= i < top]
    bottom += 10
    top += 10

现在,您可以使用solution['list_1020']来获取所需的数据。

答案 3 :(得分:0)

您始终可以使用itertools.groupby()按照较低的范围对已排序的数字进行分组:

from itertools import groupby

x=[11,12,21,34,35,36]

grouped = [list(g) for _, g in groupby(x, key = lambda x: (x//10) * 10)]

print(grouped)

哪个输出:

[[11, 12], [21], [34, 35, 36]]

然后你可以将这些列表插入字典中:

ranges = ['list_1020', 'list_2030', 'list_3040']
d = dict(zip(ranges, grouped))
# {'list_1020': [10, 11, 12], 'list_2030': [21], 'list_3040': [34, 35, 36]}

甚至是单行:

grouped = dict(('list_' + str(k) + str(k+10), list(g)) for k, g in groupby(x, key = lambda x: (x//10) * 10))
# {'list_1020': [10, 11, 12], 'list_2030': [21], 'list_3040': [34, 35, 36]}

答案 4 :(得分:0)

也许您可以简单地使用Python Dictionary,因为您需要使用名称为list_1020list_2030等的命名容器。此外,这会给您一些空间,因为它会动态生成为Dictionary Keys。以下是这个想法在代码中的样子:

listDict    = {}
x           = [11,12,21,34,35,36]

for q in range(10, 40, 10):
    tKey    = (q, (q+10))
    dictKey = "list_{}{}".format(tKey[0], tKey[1])
    listDict[dictKey] = [i for i in x if i in range(tKey[0], tKey[1]+1)]


print(listDict)
print(listDict["list_1020"])
print(listDict["list_2030"])
print(listDict["list_3040"])

作为可重复使用的功能:

def groupDataValues(x, minVal=10, maxVal=40, step=10):
    listDict    = {}
    for q in range(minVal, maxVal, step):
        tKey    = (q, (q+step))
        dictKey = "list_{}{}".format(tKey[0], tKey[1])
        listDict[dictKey] = [i for i in x if i in range(tKey[0], tKey[1]+1)]
    return listDict

x           = [11,12,21,34,35,36]
listDict    = groupDataValues(x, 10, 40, 10)

enter image description here

答案 5 :(得分:0)

你可以通过从10,20,30找到int的距离来做这样的事情

map_dict={10:'10-20',20:'20-30',30:'30-40'}



x=[11,12,21,34,35,36]

dict_1={}

for i in x:
    for b in map_dict.keys():
        if i not in dict_1:
            dict_1[i]=[(abs(i-b),b)]
        else:
            dict_1[i].append((abs(i-b),b))

final_output={}

for key,value in dict_1.items():
    if map_dict[min(value)[1]] not in final_output:
        final_output[map_dict[min(value)[1]]]=[key]
    else:
        final_output[map_dict[min(value)[1]]].append(key)

print(final_output)

输出:

{'20-30': [21], '10-20': [11, 12], '30-40': [34, 35, 36]}