我有
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的新手 - 这是一个学习语言的暑期项目 - 我对列表中的列表索引很不稳定,特别是在这些循环中。
答案 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]
在您的第一个子列表中提取第三个元素,即8
,sub[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)是该语言的新手,我认为您可以看到列表理解被用作替代方案。