对于2D列表[[“ bacon”,“ banana”],[“ ham”,“ salami”,“ cheese”]]我想依次迭代为“ bacon”,“ banana”,“ ham” ”等。
sandwiches = [["bacon", "banana"], ["ham", "salami", "cheese"]]
preferences = ["bacon", 5, "ham", -2, "salami", 1]
在三明治阵列中,有2个三明治,培根+香蕉和火腿+萨拉米+奶酪。我想通过这样的操作来了解每个三明治的分数(不起作用,但显示了我想做的事情):
sandwichscores = [0 for i in sandwiches]
sandwichscores = [+preferences[preferences.index(j)+1] for j in i in sandwiches if
j in preferences]
但是对于三明治中i中的j当然不起作用。我尝试弄乱了前后关系的顺序,但是却一无所获。该怎么办?
例如,我想要的输出是:
sandwichscores = [5, -1]
由于这些成分在第一个三明治中的总得分为5,在第二个三明治中的得分为-1。不在首选项中的成分将被忽略。
答案 0 :(得分:1)
我认为这是您要使用的逻辑,将其解压缩到嵌套的for循环中:
gsub("(.{4})", "\\1 ", "abcdefghi")
for i, sandwich in enumerate(sandwiches):
for filling in sandwich:
if filling in preferences:
sandwichscores[i] += preferences[preferences.index(filling)+1]
正如我惊异的外星人所说,如果您使用分数作为字典,逻辑会简单得多:
print(sandwichscores)
>>> [5, -1]
答案 1 :(得分:1)
这里是一线工作,可以满足您的需求;我将您的偏好设置列表转换为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)
输出:
[['bacon, banana', 5], ['ham, salami, cheese', -1]]
该解决方案使用sum
来将三明治成分的值相加,并根据该成分是否出现在prefs
中进行过滤。
您可以更改输出格式以删除成分列表,而只需通过更改[ ", ".join(i), sum( prefs[j] for j in i if j in prefs) ]
部分来输出分数。我本来以为知道哪个三明治得到哪个分数很重要,但是谁知道呢!
答案 2 :(得分: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)
打印:
[(['bacon', 'banana'], 1005), (['ham', 'salami', 'cheese'], 997)]
对于三明治['bacon', 'banana']
:培根为5,香蕉为1000,三明治得分为1005
对于三明治['ham', 'salami', 'cheese']
:火腿为-2,萨拉米香肠为999,桑威奇得分为997
答案 3 :(得分:0)
我将使用dictionary进行分数查找-它是用于查找的指定数据结构。
您可以从preferences
的表示形式转到带有字典理解的字典:
preferences = ["bacon", 5, "ham", -2, "salami", 1]
prefs = {k:v for k,v in zip(preferences[::2],preferences[1::2])} # dict-comprehension
这使用zip()将以0 ["bacon","ham","salami"]
开始的每个第二元素连接到以1 [5,-2,1]
开始的每个第二元素,从而产生(("bacon,5),("ham",-2),("salami",1))
的压缩生成器。
然后将zip-generator-result分解为创建字典的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)
score
汇总您定义的每个沙棘的每种成分得分。如果找不到成分,则添加0。
输出是三明治及其得分的元组:
[(['bacon', 'banana'], 5), (['ham', 'salami', 'cheese'], -1)]
答案 4 :(得分:0)
尽管我将preferences
的结构更改为字典,但是这是另一种方法,它更实用,更易于使用:
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)
输出:
[5, -1]