Python 在一行中遍历二维列表

Python 在一行中遍历二维列表,python,arrays,list,for-loop,multidimensional-array,Python,Arrays,List,For Loop,Multidimensional Array,对于2D列表[[“培根”、“香蕉”]、[“火腿”、“意大利腊肠”、“奶酪”]],我想重复“培根”,然后是“香蕉”,然后是“火腿”等等 在三明治阵列中,有2个三明治,培根+香蕉和火腿+意大利腊肠+奶酪。我想通过做这样的事情来知道每个三明治的分数(不起作用,但表明我想做什么): 但当然,三明治里的j-in-i不起作用。我试着去摆弄福斯和ins的秩序,但都没成功。这怎么可能呢 例如,我希望这里的输出是: sandwichscores = [5, -1] 因为第一个三明治的配料综合得分为5分,第二个三

对于2D列表[[“培根”、“香蕉”]、[“火腿”、“意大利腊肠”、“奶酪”]],我想重复“培根”,然后是“香蕉”,然后是“火腿”等等

在三明治阵列中,有2个三明治,培根+香蕉和火腿+意大利腊肠+奶酪。我想通过做这样的事情来知道每个三明治的分数(不起作用,但表明我想做什么):

但当然,三明治里的j-in-i不起作用。我试着去摆弄福斯和ins的秩序,但都没成功。这怎么可能呢

例如,我希望这里的输出是:

sandwichscores = [5, -1]

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

这里有一个使用
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)
印刷品:

[(['bacon', 'banana'], 1005), (['ham', 'salami', 'cheese'], 997)]
对于三明治,培根有5分,香蕉有1000分,三明治分数是1005分


对于三明治
['ham'、'salami'、'cheese']
:火腿为-2,salami为999,三明治得分为997

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)
印刷品:

[(['bacon', 'banana'], 1005), (['ham', 'salami', 'cheese'], 997)]
对于三明治,培根有5分,香蕉有1000分,三明治分数是1005分


对于三明治
['ham'、'salami'、'cheese']
:ham有-2,salami有999,sanwich分数是997

我认为这就是您想要使用的逻辑,解包到嵌套的For循环中:

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

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

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

#...

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

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

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

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

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

#...

for i, sandwich in enumerate(sandwiches):
    for filling in sandwich:
        sandwichscores[i] += preferences.get(filling, 0)
我将使用a进行分数查找-它是用于查找的指定数据结构

您可以从您对
首选项的表示方式
转到具有dict理解的词典:

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

prefs = {k:v for k,v in zip(preferences[::2],preferences[1::2])} # dict-comprehension
这用于将从0开始的第二个元素连接到从1开始的第二个元素,从而生成
((“培根,5),(“火腿”,“萨拉米”,1))

然后将zip生成器结果分解为创建dict的
key:value


有了这些,你可以这样计算你的总数:

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

score = [ (sandw, sum( prefs.get(ingred,0) 
                       for ingred in sandw)) 
          for sandw in sandwiches ]

print(score) 
得分
汇总了您定义的每个沙盘的每个成分得分。如果未找到成分,则添加0

输出是三明治及其分数的元组:

 [(['bacon', 'banana'], 5), (['ham', 'salami', 'cheese'], -1)]
我将使用a进行分数查找-它是用于查找的指定数据结构

您可以从您对
首选项的表示方式
转到具有dict理解的词典:

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

prefs = {k:v for k,v in zip(preferences[::2],preferences[1::2])} # dict-comprehension
这用于将从0开始的第二个元素连接到从1开始的第二个元素,从而生成
((“培根,5),(“火腿”,“萨拉米”,1))

然后将zip生成器结果分解为创建dict的
key:value


有了这些,你可以这样计算你的总数:

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

score = [ (sandw, sum( prefs.get(ingred,0) 
                       for ingred in sandw)) 
          for sandw in sandwiches ]

print(score) 
得分
汇总了您定义的每个sandwinch的每个成分得分。如果未找到成分,则添加0

输出是三明治及其分数的元组:

 [(['bacon', 'banana'], 5), (['ham', 'salami', 'cheese'], -1)]

这是一个一行,做你想做的;我将您的首选项列表转换为,因为这是一个:

输出:

[['bacon, banana', 5], ['ham, salami, cheese', -1]]
[5, -1]
该解决方案用于将三明治成分的值相加,并根据成分是否出现在
prefs
中进行过滤


您可以更改输出格式以删除成分列表,只需通过更改
[“,”.连接(i),求和(如果j在prefs中,则prefs[j]表示j在i中)]
部分来输出分数。我本以为知道哪个三明治得了哪个分数很重要,但谁知道呢

这是一条你想做什么就做什么的单行线;我将您的首选项列表转换为,因为这是一个:

输出:

[['bacon, banana', 5], ['ham, salami, cheese', -1]]
[5, -1]
该解决方案用于将三明治成分的值相加,并根据成分是否出现在
prefs
中进行过滤


您可以更改输出格式以删除成分列表,只需通过更改
[“,”.连接(i),求和(如果j在prefs中,则prefs[j]表示j在i中)]
部分来输出分数。我本以为知道哪个三明治得了哪个分数很重要,但谁知道呢

这里是另一种方法,尽管我将
首选项
的结构更改为dictionary,它更实用,更易于使用:

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

scores = [sum(preferences.get(ingredient,0) for ingredient in sandwich) for sandwich in sandwiches]
print(scores)
输出:

[['bacon, banana', 5], ['ham, salami, cheese', -1]]
[5, -1]

下面是另一种方法,尽管我将
首选项
的结构更改为dictionary,它更实用,更易于使用:

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

scores = [sum(preferences.get(ingredient,0) for ingredient in sandwich) for sandwich in sandwiches]
print(scores)
输出:

[['bacon, banana', 5], ['ham, salami, cheese', -1]]
[5, -1]

你最好为自己的喜好准备一本字典:
preferences={'bacon':5,'ham':-2}
不清楚你在问什么。迭代中“培根”和“香蕉”之后是什么?是“火腿”、“意大利腊肠”、“奶酪”还是别的什么?还不清楚您想要什么输出。只要每个元素迭代一次,顺序就无关紧要。事实上,这很重要。对不起,我希望我已经澄清了我想要的顺序的模糊性。说清楚了,您想生成培根/火腿、培根/腊肠、培根/奶酪、香蕉/火腿、香蕉/腊肠的分数吗,香蕉/奶酪?你最好有一本字典来记录你的偏好:
preferences={'bacon':5,'ham':-2}
不清楚你在问什么。迭代中“培根”和“香蕉”之后是什么?是“火腿”、“意大利腊肠”、“奶酪”还是别的什么?你想要什么样的输出也不清楚。只要每个元素迭代一次,顺序就无关紧要。事实上,这很重要。对不起,我希望我已经澄清了我想要的顺序的模糊性。说清楚了,你想生成分数吗