根据条件值创建列表

时间:2019-11-25 06:44:04

标签: python list conditional-statements

我试图形成多个列表,并根据条件将另一个列表的值排序到每个列表中。

我有以下内容:

b_421, b_521, b_621, b_721, b_821, b_921, b_1021, b_1121, b_1221, b_1321, b_1421, b_1520 = ([] for i in range(12))

for n in x_list:
    if n < float(421):
        b_421.append(n)
    elif float(421) <= n < float(521):
        b_521.append(n)
    elif float(521) <= n < float(621):
        b_621.append(n)
    elif float(621) <= n < float(721):
        b_721.append(n)
    elif float(721) <= n < float(821):
        b_821.append(n)
    elif float(821) <= n < float(921):
        b_921.append(n)
    elif float(921) <= n < float(1021):
        b_1021.append(n)
    elif float(1021) <= n < float(1121):
        b_1121.append(n)
    elif float(1121) <= n < float(1221):
        b_1221.append(n)
    elif float(1221) <= n < float(1321):
        b_1321.append(n)
    elif float(1321) <= n < float(1421):
        b_1421.append(n)
    elif float(1421) <= n < float(1520):
        b_1520.append(n)

但是,我的所有列表都包含原始列表x_list中的所有元素。

我在做什么错了?

已编辑

即使我以以下方式定义列表:

b_421=[]
b_521=[]
b_621=[]
b_721=[]
b_821=[]
b_921=[]
b_1021=[] 
b_1121=[] 
b_1221=[] 
b_1321=[] 
b_1421=[] 
b_1520=[]

我仍然让b_421包含原始列表中的所有数字。原始列表是从pandas dataFrame列创建的,这可能是问题吗?

x_list = df['col1'].tolist()

我得到此结果的唯一方法是给我我想要的输出,即每个列表都包含期望范围内的值,是我像上面那样单独定义列表,然后为每个列表创建一个单独的(如果组合)清单。这样:

for n in x_list:
    if n < float(421):
        b_421.append(n)
for n in x_list:
    if float(421) <= n < float(521):
        b_521.append(n)  
for n in x_list:        
    if float(521) <= n < float(621):
        b_621.append(n)
for n in x_list:  
    if float(621) <= n < float(721):
        b_721.append(n)
for n in x_list:  
    if float(721) <= n < float(821):
        b_821.append(n)
for n in x_list:  
    if float(821) <= n < float(921):
        b_921.append(n)
for n in x_list:  
    if float(921) <= n < float(1021):
        b_1021.append(n)
for n in x_list:  
    if float(1021) <= n < float(1121):
        b_1121.append(n)
for n in x_list:  
    if float(1121) <= n < float(1221):
        b_1221.append(n)
for n in x_list:  
    if float(1221) <= n < float(1321):
        b_1321.append(n)
for n in x_list:  
    if float(1321) <= n < float(1421):
        b_1421.append(n)
for n in x_list:  
    if float(1421) <= n < float(1520):
        b_1520.append(n)

这对我来说很疯狂-也许我的环境刚刚坏了?

2 个答案:

答案 0 :(得分:1)

代码似乎运行正常。我想您已经正确定义了列表。这是一种更好的方法:您可以创建一个字典来存储所有列表:

steps = [421, 521, 621, 721, 821, 921, 1021, 1121, 1221, 1321, 1421, 1520]
output = { 'b_' + str(value): [] for value in steps }
steps.insert(0, 0)
ranges = [[steps[i], steps[i + 1]] for i in range(len(steps) - 1)]
for n in x_list:
    for range in ranges:
        if float(range[0]) <= n < float(range[1]):
             output['b_' + str(range[1])].append(n)

这不是最有效的解决方案,因为即使将循环添加到列表中,它也会运行循环。这是示例输入和输出:

输入

x_list = [1, 123, 345, 567, 678, 1000]

输出

output = {'b_421': [1, 123, 345], 'b_521': [], 'b_621': [567], 'b_721': [678], 'b_821': [], 'b_921': [], 'b_1021': [1000], 'b_1121': [], 'b_1221': [], 'b_1321': [], 'b_1421': [], 'b_1520': []}

答案 1 :(得分:0)

我假设您以这种方式创建了所有列表:

b_421 = b_521 = []

将一个变量分配给另一个变量会使它们指向内存中的同一区域,然后对一个变量所做的任何更改也将反映另一个变量。

这个主题很好地解释了here

FYI-如何对多个列表进行正确分配。