将2D列表中的第一个匹配项添加到另一个列表中(Python 3.4.2)

时间:2015-02-26 19:44:51

标签: python python-3.x for-loop multidimensional-array enumerate

这是我目前的代码:

num = 0
sav = [["Name: ", "Josh", "Score", "1"], ["Name", "James", "Score: ", "2"], ["Name: ", "Josh", "Score: ", "2"]]
sav2 = [[]*5 for _ in range(len(sav)]
name2 = sav[num][1]

for i, j in enumerate(sav2):
    if name2 not in j:
        sav2.append(sav[num])
        num = num+1
        print('hi')
    else:
        print('hello')
        num = num+1

print(sav2)

理想情况下,每个名称和分数都会进入sav2,只要该名称不在其中。但是,当我运行这个时,我得到一个错误 - 列表索引超出sav2.append(sav[num])范围。 (注意 - "hi""hello"只是为了确保我的if / else语句正常工作(确实如此)。)

最终结果:

sav2 = [["Name: ", "Josh","Score: ", "1"], ["Name: ", "James", "Score: ", "2"]]

2 个答案:

答案 0 :(得分:1)

如何将它们存储在字典中?

sav2 = {}
for (name, number) in list_of_lists:
    if name not in sav2:
         sav2[name] = number

导致:

sav2 = {"Josh":"1", "James":"2"}

如果你需要保留列表排序,你可以使用OrderedDict,如果你想要的话,可以回到列表列表:

sav2list = [[k,v] for k,v in sav2.items()]

当你需要在代码中添加功能时,将它们放在字典中几乎肯定会帮助你,因为你可能想要按值而不是索引来查找。

答案 1 :(得分:1)

我认为没有理由进行枚举,因为它没有显示列表中的索引对结果很重要。只需遍历列表,拉出两个值,然后只需验证拉出的第一个值是否已经存在于sav2中。如果找到匹配项,可以使用for循环中的else子句来完成此操作,并与break语句结合使用。

    sav = [["Josh", "1"], ["James", "2"], ["Josh", "2"]]
    sav2 = []
    for i, j in sav:
        for name, num in sav2:
            if name == i:
                break
        else:
            sav2.append([i,j])
    print(sav2)
相关问题