如何测试一个列表中的两个元素,如果它们是等效的,则将一个列表的元素放入新列表中

时间:2013-04-03 19:54:23

标签: python

我有3个列表:

neighbour = []
scanned = [[],[]]   
localisation = [[],[],[]] 

我想测试扫描列表的第0个子列表(列)中的每个项目,看它是否等同于邻居列表中的任何项目。

如果它是等效的,我想将扫描的两个子列表附加到本地化的第一和第二个子列表中。

我相信此测试将检查扫描的第0个子列表中的项是否与邻居子列表中的任何项匹配:

for i in scanned[0]:
    for j in neighbour:
        if i == j:

但我不确定如何将扫描的两个子列表附加到本地化的第一和第二个子列表中。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

好吧,我可能会以不同的方式构建你的列表,但我会在一分钟内完成。

要做你想做的事,你需要以更老派的方式进行迭代:

neighbour = ['a', 'b', 'c']
scanned = [['a', 'b'],[1, 2]]   
localisation = [[],[],[]] 

for i in range(len(scanned[0])):
    if scanned[0][i] in neighbour:
        localisation[1].append(scanned[0][i])
        localisation[2].append(scanned[1][i])
print localisation
>>> [[], ['a', 'b'], [1, 2]]

这是假设我(最终)正确理解你想要的东西。但是,看起来scanned实际上是两个列表,其中一个列表中的每个元素以某种方式与另一个列表中的同一索引元素相关。通过使用dict代替您的生活可能会更容易:

# The keys from the dict are from scanned[0]; the values are from scanned[1]
scanned = {'a':1, 'b':2}

现在,与这些列表有关的所有内容都更容易(包括您必须处理的其他内容),因为您无需单独跟踪索引:

neighbour = ['a', 'b', 'c']
scanned = {'a':1, 'b':2}
localisation = [[], [], []] 

for s in scanned:
    if s in neighbour:
        localisation[1].append(s)
        localisation[2].append(scanned[s])

print localisation
>>> [[], ['a', 'b'], [1, 2]]

答案 1 :(得分:1)

您的问题与NLP Stemming有关吗?如果是这样,请查看Python NLTK

scanned中的每个子列表生成匹配元素列表:

for l in scanned:
    localisation.append(set(l).intersection(neighbour))

你的定义有点混乱,我不确定我是否理解你想要的东西。假设len(scanned[0]) == len(scanned[1])

matches = set(neighbour).intersection(scanned[0])
for match in matches:
    i = scanned.index(match)
    localisation.append((match, scanned[0][i], scanned[1][i]))

在这种情况下,dict优于列表列表。

neighbour = ['Good morning', 'Good afternoon']
scanned = {'Good morning': 'Buenos dias', 'Good night': 'Buenas noches'}
localisation = []

matches = set(neighbour).intersection(scanned.keys())
for match in matches:
    localisation.append((match, scanned[match]))

请提供样本输入和预期输出。