在1行中遍历二维列表

时间:2018-08-05 09:21:12

标签: python arrays list for-loop multidimensional-array

对于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。不在首选项中的成分将被忽略。

5 个答案:

答案 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]