在Python中比较列表项与另一个列表的索引

3
我想比较两个列表,使用第一个列表的项与第二个列表的索引进行匹配,并为每个匹配项从第二个列表中添加到新列表中。
a = [[1],[0],[0]]
b = [[1,2],[3,4],[5,6]]
c = []
for item in a:
     for i in range(len(b)):
          if item == b[i]:
              c.append(b[i])

答案应该像这样:
c = [[3,4],[1,2],[1,2]]

代码返回空列表。 - Moj
不,它不起作用,它返回 [ ]。 - user3748972
1
我不理解根据你的期望输出应该在哪里进行比较,因此我不明白所有答案中只是通过从列表a中获取的索引来添加一个元素从而达到对b列表的追加。 - Kobi K
你能否将你的a改为整数列表,而不是嵌套列表? - Pokey McPokerson
实际上,a是通过比较另外两个不同列表的索引得出的结果。从a中,我需要生成另一个列表b,其中b的索引与a中的项目匹配。 - user3748972
你如何进行比较?如果你能将每个值存储为int,那么这将更容易。 - Pokey McPokerson
5个回答

4

最简单的:

c = [b[i[0]] for i in a]

我建议添加范围检查:

c = [b[i[0]] for i in a if (0 <= i[0] < len(b))]

编辑:根据您对a的澄清,我建议更改:

def findInstances(list1, list2):
    for i in list1:
        yield [pos for pos,j in enumerate(list2) if i==j] # This yields a list containing the value you want

to:

def findInstances(list1, list2):
    for i in list1:
        if (i in list2): 
            yield list2.index(i) # This yields only the value you want

这将使您的列表变平,并使问题更简单。然后您可以使用以下内容:
c = [b[i] for i in a if (0 <= i < len(b))]

根据您获取 a 的方式,实际上范围检查是不必要的。不过,我还是保留了它们,以防您以后以不同的方式获取 a


2
In [1]: a = [[1],[0],[0]]

In [2]: b = [[1,2],[3,4],[5,6]]

In [3]: [b[x[0]] for x in a] 
Out[3]: [[3, 4], [1, 2], [1, 2]]

2
为什么要使用嵌套推导式?只需使用[b[x[0]] for x in a]即可。 - georg
哦,天啊!非常感谢……我可能看起来很傻,但我在编程方面特别是Python方面完全是新手,再次感谢。 - user3748972

2

使用NumPy索引:

>>a = np.asarray(a)
>>b = np.asarray(b)
>>b[a]
array([[[3, 4]],

       [[1, 2]],

       [[1, 2]]])

1
你的算法几乎正确。问题出在 if 语句上。如果你在测试相等之前尝试打印出 itemb[i],你会看到问题所在。
>>> a = [[1],[0],[0]]
>>> b = [[1,2],[3,4],[5,6]]
>>> c = []
>>> for item in a:
>>>      for i in range(len(b)):
>>>           print("item == b[i] is {} == {} is {}".format(item, b[i], 
                      item == b[i]))
>>>           if item == b[i]:
>>>               c.append(b[i])
item == b[i] is [1] == [1, 2] is False
item == b[i] is [1] == [3, 4] is False
item == b[i] is [1] == [5, 6] is False
item == b[i] is [0] == [1, 2] is False
item == b[i] is [0] == [3, 4] is False
item == b[i] is [0] == [5, 6] is False
item == b[i] is [0] == [1, 2] is False
item == b[i] is [0] == [3, 4] is False
item == b[i] is [0] == [5, 6] is False

你实际上一直在检查ab中的每个元素是否相等。相反,你想要检查a中每个项目中的元素是否与b的索引相等。
例如:
for item_a in a:
    for index_b, item_b in enumerate(b):
        # only check index 0 of item_a as all lists are of length one.
        print("item_a[0] == index_b is {} == {} is {}".format(item_a[0], 
                  index_b, item_a[0] == index_b))
        if item_a[0] == index_b:
            c.append(item_b)

产生:

item_a[0] == index_b is 1 == 0 is False
item_a[0] == index_b is 1 == 1 is True
item_a[0] == index_b is 1 == 2 is False
item_a[0] == index_b is 0 == 0 is True
item_a[0] == index_b is 0 == 1 is False
item_a[0] == index_b is 0 == 2 is False
item_a[0] == index_b is 0 == 0 is True
item_a[0] == index_b is 0 == 1 is False
item_a[0] == index_b is 0 == 2 is False

enumerate 是一个内置的辅助函数,它返回一个包含列表(或任何可迭代对象)中每个元素的索引和元素的元组。

除非必要,我也建议将 a 扁平化,因为在这里使用嵌套列表是多余的,例如 a = [1, 0, 0]

话虽如此,如果你能理解列表推导式,编写一个解决方案会更简单——正如其他回答你问题的人所证明的那样。


没问题,你说你刚开始学习,所以我想你真正想知道的是为什么你的代码不起作用,而不是一个实际的答案。 - Dunes
如果有疑问,就打印输出! - Pokey McPokerson

0

这是我如何比较另外两个不同的列表。

def findInstances(list1, list2):
    for i in list1:
    yield [pos for pos,j in enumerate(list2) if i==j]


list1 = [0.1408, 0.1456, 0.2118, 0.2521, 0.1408, 0.2118]
list2 = [0.1408, 0.1456, 0.2118, 0.2521, 0.1254, 0.1243]
list3 = [[1,2],[3,4],[5,6],[7,8],[9,10],[11,12]]
res = list(findInstances(list1, list2))

并且res在第一个问题中产生了输出'a'

谢谢


我更新了我的答案,并提出了findInstances函数的建议。 - Pokey McPokerson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接