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

Adding first occurrence in a 2D list to another list (Python 3.4.2)

这是我目前的代码:

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"]]

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

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()]

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

我认为没有理由进行枚举,因为列表中的索引似乎对结果并不重要。只需遍历列表,取出两个值,然后简单地验证取出的第一个值是否已经在 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)