比较N个列表并在存在差异的地方插入/追加空白条目

2024-10-03 17:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试处理几个长列表(每个列表中大约有2000个条目)。我们的目标是通过并排查看列表并找出存在差异的地方来对列表进行排序。你知道吗

示例:

a = ['andrew', 'benjamin', 'franklin', 'erica', 'robert', 'jessica']
b = ['andrew', 'franklin', 'robert', 'delmar']
c = ['aaron', 'erica']

a.sort()
b.sort()
c.sort()

#do some operation that leaves us with:

a = [ '', 'andrew', 'benjamin', '', 'erica', 'franklin', 'jessica', 'robert']
b = ['', 'andrew', '', 'delmar', '', 'franklin', '', 'robert']
c = ['aaron', '', '', '', 'erica', '', '', '']

最后,您有三个列表,这样,如果您要逐条打印它们,您将有一种“diff”视图,显示列表之间的差异。每个列表长度相同。你知道吗

我希望这个能和任何输入一起工作,我一直在用数字做一些事情。为了让它处理任意数量的列表,我一直在向它传递一个列表列表。以下是我目前的代码:

def recursiveCompare(allLists, compareList):
    if compareList >= 0:
        for i in xrange(len(allLists[-1])):
            if (i <= (len(allLists[compareList]) - 1)):
                if (allLists[compareList][i] > allLists[-1][i]):
                    allLists[compareList].insert(i, "")
                if (allLists[compareList][i] < allLists[-1][i]):
                    allLists[-1].insert(i, "")
            else:
                if (allLists[compareList]) < (allLists[-1]):
                    allLists[compareList].append("")
                if (allLists[-1]) < (allLists[compareList]):
                    allLists[-1].append("")

        return recursiveCompare(allLists, compareList - 1)
    else:
        return allLists

c = [2, 3, 4, 5, 6]
b = [2, 3, 5]
a = [1, 2, 7]

allLists = [a, b, c]
allLists.sort(key=len)

allListsNew = recursiveCompare(allLists, len(allLists) - 1)

最后,通过这个代码,我得到:

[[1,2,7],[2,3,5],[2,3,4,5,6]]->;[[1,2,'','','','','','',7],[2,3,'',5],'',2,3,4,5,6']]

除了中间的列表,这看起来基本上是正确的。然而,外表是有欺骗性的,当只运行第一个和最后一个列表时,结果并不是我想要的。你知道吗

无论如何,我都不是python专家,而且我相当肯定没有一种有效的方法可以做到这一点。但我肯定被卡住了,如果有人知道类似的问题,我可以用一些眼睛来观察它,或者用一个正确方向的指针。你知道吗

谢谢你。你知道吗


Tags: 列表lenif差异sortrobertandrewfranklin
1条回答
网友
1楼 · 发布于 2024-10-03 17:23:19

可以使用集合有效地执行元素检查:

c = [2, 3, 4, 5, 6]
b = [2, 3, 5]
a = [1, 2, 7]

allLists = [a, b, c]

allSets = list(map(set, allLists))
allTokens = set.union(*allSets)
sortedTokens = sorted(allTokens)

如果字符串存在于各自的集合中,则将其转换为列表:

transposed = [tuple(map(lambda x: w if w in x else '', allSets))
              for t in sortedTokens]
result = zip(*transposed)

相关问题 更多 >