将列表列表中的项目更改为指定值并将其用于计算

Change items in list of list into assigned value and use them for calculations

我正在尝试计算 Python 列表列表 (fixed_uncertainty2) 中所有列表的值。

首先,我需要将子列表的每个项目转换为字典分配的值 item_var(例如,将 'F' 转换为 2)。然后我想计算总和(然后将其存储在变量中或打印出来)。我需要为每个子列表执行此操作。所以对于下面的第一个子列表,它将被转换为 [2, 1, -2, -1, 2, 1],所以它的总和(保存为 comb_value)= 3.

使用下面的代码,我只能设法对第一个子列表执行此操作,但它不会将其他子列表中的值转换为数字。有谁知道错误在哪里?

i = 0
j = 0
comb = []
item_var = {'F': 2, 'f': 1, 'C': -2, 'c': -1}
fixed_uncertainty2 = [['F', 'f', 'C', 'c', 'F', 'f'], ['F', 'f', 'C', 'c', 'F', 'F'], ['F', 'f', 'C', 'c', 'f', 'F'], ['F', 'f', 'C', 'c', 'f', 'f'], ['F', 'f', 'C', 'c', 'C', 'c']]
while j in range(len(fixed_uncertainty2)):
    comb = fixed_uncertainty2[j]
    while i in range(len(comb)):
        for item in comb:
            comb[i] = item_var[item]
            i += 1
        comb_value = sum(comb)

错误在第一时间!你没有在每一轮完成后添加到“j”!

comb = []
item_var = {'F': 2, 'f': 1, 'C': -2, 'c': -1}
fixed_uncertainty2 = [['F', 'f', 'C', 'c', 'F', 'f'], ['F', 'f', 'C', 'c', 'F', 'F'], ['F', 'f', 'C', 'c', 'f', 'F'], ['F', 'f', 'C', 'c', 'f', 'f'], ['F', 'f', 'C', 'c', 'C', 'c']]
while j in range(len(fixed_uncertainty2)):
    comb = fixed_uncertainty2[j]
    while i in range(len(comb)):
        for item in comb:
            comb[i] = item_var[item]
            i += 1
        comb_value = sum(comb)
    j+=1

顺便说一句,你为什么不使用 for 呢?只是为了避免这些小错误和更清晰的代码:

comb = []
item_var = {'F': 2, 'f': 1, 'C': -2, 'c': -1}
fixed_uncertainty2 = [['F', 'f', 'C', 'c', 'F', 'f'], ['F', 'f', 'C', 'c', 'F', 'F'], ['F', 'f', 'C', 'c', 'f', 'F'], ['F', 'f', 'C', 'c', 'f', 'f'], ['F', 'f', 'C', 'c', 'C', 'c']]
for j in range(len(fixed_uncertainty2)):
    comb = fixed_uncertainty2[j]
    for i in range(len(comb)):
        for item in comb:
            comb[i] = item_var[item]
        comb_value = sum(comb)
comb = []
item_var = {'F': 2, 'f': 1, 'C': -2, 'c': -1}
fixed_uncertainty2 = [['F', 'f', 'C', 'c', 'F', 'f'], ['F', 'f', 'C', 'c', 'F', 'F'], ['F', 'f', 'C', 'c', 'f', 'F'], ['F', 'f', 'C', 'c', 'f', 'f'], ['F', 'f', 'C', 'c', 'C', 'c']]
sub_sums = []
for sublist in fixed_uncertainty2:
    values = [item_var[k] for k in sublist]
    sub_sums.append(sum(values))

这里有 sub_sums

[3, 4, 3, 2, -3]

总和为 sum()sub_sums

这里有一个方法:

item_var = {'F': 2, 'f': 1, 'C': -2, 'c': -1}

fixed_uncertainty2 = [["F", "f", "C", "c", "F", "f"],
                      ["F", "f", "C", "c", "F", "F"],
                      ["F", "f", "C", "c", "f", "F"],
                      ["F", "f", "C", "c", "f", "f"],
                      ["F", "f", "C", "c", "C", "c"]]

comb = sum([item_var[i] for j in fixed_uncertainty2 for i in j])

print(comb)

输出:

9
item_var = {"F": 2, "f": 1, "C": -2, "c": -1}
fixed_uncertainty2 = [
    ["F", "f", "C", "c", "F", "f"],
    ["F", "f", "C", "c", "F", "F"],
    ["F", "f", "C", "c", "f", "F"],
    ["F", "f", "C", "c", "f", "f"],
    ["F", "f", "C", "c", "C", "c"],
]

for sub_list in fixed_uncertainty2:
    for index, item in enumerate(sub_list[:]):
        sub_list[index] = item_var.get(item, item)

此时fixed_uncertainty2已更改为:

[
    [2, 1, -2, -1, 2, 1],
    [2, 1, -2, -1, 2, 2],
    [2, 1, -2, -1, 1, 2],
    [2, 1, -2, -1, 1, 1],
    [2, 1, -2, -1, -2, -1],
]

现在分别计算每个子列表的总和:

sum_of_sub_lists = [sum(sub_list) for sub_list in fixed_uncertainty2]

这将为您提供最终输出:

[3, 4, 3, 2, -3]

您混淆了关键字 while 和关键字 for 的用法。

在第二个 while 循环之上移动 i = 0 一行并在末尾添加 j += 1 都可以使您的代码正常工作。但是 pythonic 的方法是使用这样的内置函数:

item_var = {'F': 2, 'f': 1, 'C': -2, 'c': -1}
fixed_uncertainty2 = [['F', 'f', 'C', 'c', 'F', 'f'], ['F', 'f', 'C', 'c', 'F', 'F'], ['F', 'f', 'C', 'c', 'f', 'F'], ['F', 'f', 'C', 'c', 'f', 'f'], ['F', 'f', 'C', 'c', 'C', 'c']]

for sublist in fixed_uncertainty2:
    comb_value = sum(map(lambda x: item_var[x], sublist))
    print(comb_value)

尝试检查 for 循环和内置函数:

我对其他解决方案的问题是,它们最终会在 Python 级别进行 30 次字典查找以及一个或多个循环。如果我们可以将所有这些字典查找和循环向下推到 'C' 级别会怎样:

from itertools import chain
from operator import itemgetter

item_var = {'F': 2, 'f': 1, 'C': -2, 'c': -1}

fixed_uncertainty = [
    ['F', 'f', 'C', 'c', 'F', 'f'],
    ['F', 'f', 'C', 'c', 'F', 'F'],
    ['F', 'f', 'C', 'c', 'f', 'F'],
    ['F', 'f', 'C', 'c', 'f', 'f'],
    ['F', 'f', 'C', 'c', 'C', 'c'],
]

comb = sum(itemgetter(*chain(*fixed_uncertainty))(item_var))

print(comb)

输出

% python3 test.py
9
%