python中的列表列表,想对列表中的每个值进行算术运算,然后追加到列表

时间:2015-07-24 20:22:44

标签: python

我有

expected_values =    
[[name, 4, 8, 3]
 [name, 2, 6, 9]
 [name, 3, 6, 2]]

我想做类似于将第二个值除以第一个值,然后将其乘以3,然后将该值附加到列表的末尾。所以最终产品看起来像

expected_values = 
[[name, 4, 8, 3, 6]
 [name, 2, 6, 9, 9]
 [name, 3, 6, 2, 6]]

到目前为止我所拥有的是

for name in range(0,len(expected_values)):
    total = 0
    pa = expected_values[name][1]
    pa = int(pa)
    for s in range(0,len(expected_values)):
        singles = expected_values[s][2]
        singles = int(singles)
        total = total + ((singles/pa)*3)
    expected_values.append(total)

我有int(pa),因为它是从CSV文件导入的,显然它将所有内容都作为字符串导入,所以我必须将其转换为对其进行任何数学运算。

我是Python的新手 - 这是一个学习语言的暑期项目 - 我对列表中的列表索引很不稳定,特别是在这些循环中。

2 个答案:

答案 0 :(得分:1)

只需遍历附加sub[2]/sub[1] * 3的列表,列表是可变的,append inplace 操作,因此每次附加时都要修改原始对象/列表,您不需要索引子列表或创建新列表:

expected_values =    [["name", 4, 8, 3], ["name", 2, 6, 9], ["name", 3, 6, 2]]

for sub in expected_values:
    sub.append(int(sub[2]) / int(sub[1]) * 3)

print(expected_values)

输出:

[['name', 4, 8, 3, 6], ['name', 2, 6, 9, 9], ['name', 3, 6, 2, 6]]

您只是想确保sub[2]元素不是0以避免使用ZeroDivisionError并使用默认值或更好的值:

for sub in expected_values:
    a,b = int(sub[1]), int(sub[2])
    sub.append(b / a * 3 if b else 0)

print(expected_values)

sub[2]在您的第一个子列表中提取第三个元素,即8sub[1]得到第二个元素4,您只需要乘法和追加。

如果你有实际的字符串数字,只需要调用int(sub[2])等。根据你想要发生的事情你可能还想要至少有一个浮动,如果你使用python2,/将使用ints与python 2。

答案 1 :(得分:0)

除了这里的其他答案外,还可以在一行中执行此操作:

name = "something"

expected_values =  [
                [name, 4, 8, 3],
                [name, 2, 6, 9],
                [name, 3, 6, 2]]

expected_values = [l + [(int(l[2])/int(l[1]))*3] for l in expected_values]

print(expected_values)

产地:

  

[['东西',4,8,3,6],['东西',2,6,9,9],['东西&#39 ;,3,6,2,6]]

这种理解遍及外部列表。对于其中的每个子列表,将添加一个作为数学运算结果的项目的新列表。

正如人们在评论中指出的那样,这会有稍微降低的性能(因为它会创建新的列表)并且可能更难阅读,所以另一个答案可能是更好的选择。但是,由于您(OP)是该语言的新手,我认为您可以看到列表理解被用作替代方案。