在1lin中遍历二维列表

2024-09-24 04:29:18 发布

您现在位置:Python中文网/ 问答频道 /正文

对于二维列表[[“bacon”,“banana”],[“ham”,“salami”,“cheese”]]我想迭代为“bacon”,然后是“banana”,然后是“ham”,等等

sandwiches = [["bacon", "banana"], ["ham", "salami", "cheese"]]
preferences = ["bacon", 5, "ham", -2, "salami", 1]

在三明治阵列中,有两个三明治,培根+香蕉和火腿+萨拉米+奶酪。我想通过做这样的事情来知道每个三明治的分数(不起作用,但显示了我想做什么):

^{pr2}$

当然,三明治里的j不起作用。我曾试着扰乱治安,但一无所获。怎么会这样?在

例如,我想要的输出是:

sandwichscores = [5, -1]

因为第一个三明治的配料综合得分为5,第二个三明治的综合得分为-1。不在偏好中的成分会被忽略。在


Tags: 列表事情分数bananahambacon香蕉preferences
3条回答

我想这就是您想要使用的逻辑,将其解压到嵌套的for循环中:

for i, sandwich in enumerate(sandwiches):
    for filling in sandwich:
        if filling in preferences:
            sandwichscores[i] += preferences[preferences.index(filling)+1]

^{pr2}$

正如我警告外星人说的,如果你用字典来计算分数,逻辑就简单得多:

preferences = {'bacon':5,'ham':-2,'salami':1}

#...

for i, sandwich in enumerate(sandwiches):
    for filling in sandwich:
        sandwichscores[i] += preferences.get(filling, 0)

下面是一个使用groupby的行程序:

from itertools import groupby

sandwiches = [["bacon", "banana"], ["ham", "salami", "cheese"]]
preferences = ["salami", 999, "bacon", 5, "ham", -2, "banana", 1000]

l = [(v, sum(i[-1] for i in g)) for v, g in groupby(((sandwich, preferences[preferences.index(p)+1]) for sandwich, prefs in zip(sandwiches, [preferences[::2]] * len(sandwiches)) for p in prefs if p in sandwich), key=lambda v: v[0])]
print(l)

印刷品:

^{pr2}$

三明治['bacon', 'banana']:培根5分,香蕉1000分,三明治得分1005分

对于三明治['ham', 'salami', 'cheese']:火腿是-2,萨拉米是999,桑威奇分数是997

这里有一个行程序,它可以满足您的需要;我将您的首选项列表转换为a dictionary,因为这是一个much more suitable data structure when you are storing key/value pairs

sandwiches = [["bacon", "banana"], ["ham", "salami", "cheese"]]
prefs = {"bacon": 5, "ham": -2, "salami": 1}

scores = [ [ ", ".join(i), sum( prefs[j] for j in i if j in prefs) ] for i in sandwiches ]
print(scores)

输出:

^{pr2}$

该解决方案使用^{}将三明治成分的值相加,根据成分是否出现在prefs中进行过滤。在

您可以更改输出格式以删除成分列表,并通过修改[ ", ".join(i), sum( prefs[j] for j in i if j in prefs) ]部分输出分数。我本以为知道哪个三明治得分很重要,但谁知道呢!在

相关问题 更多 >