0

我有一份清单;每个列表都有一个规定的第一个和最后一个值。对于每个第一个和最后一个值组合,我想找到唯一列表的总数。唯一性被定义为使得在具有相同第一个和最后一个值组合的列表之间,列表中间(第一个和最后一个值之间)的元素不能重复。

例如,对于以下列表列表;

[[2, 5, 7, 12], [2, 5, 10, 12], [2, 3, 12], [3, 34, 4, 6], [3, 4, 6]]

有 2 个第一个和最后一个值组合:[2,...,12] 和 [3,...,6]。一组唯一列表将是:

[[2, 5, 7, 12], [2, 3, 12], [3, 34, 4, 6]]

唯一列表的其他组合是可能的,但是我只关心唯一列表的数量。对于上面的示例,组合 [2,...,12] 有 2 个唯一列表,组合 [3,...,6] 有 1 个唯一列表。

在 python 中执行此操作的最佳方法是什么?

4

2 回答 2

2

最直接的方法是通过它们的第一个和最后一个值来索引所有列表,然后过滤它们。

您可以通过将所有这些列表添加到所有键都是(first, last)元组的字典中来做到这一点。然后你会检查每一个并删除重复项。

一个简单的例子:

mapping = defaultdict(list)
for item in target_lists:
   mapping[item[0], item[-1]].append(item)

for k, items in mapping.iteritems():
   mapping[k] = [some_filter_function(v) for v in items]

您必须对此进行一些修改以设置您的条件以决定它是否重复(我不确定我是否理解您的标准)。

希望能帮助到你!

更新

我想我理解你的标准。您需要做的是跟踪列表中的哪些元素多次出现。然后您浏览列表,检查您制作的记录(仅记录一次)是否存在不应该存在的元素。如果有,则丢弃该元素。一种方法与此类似:

for k, items in mapping.iteritems():
    count_item = defaultdict(int)
    for item in items:
        for i in item[1:-1]:
            count_item[i] += 1
    mapping[k] = [item for item in items if all(count_item[i] == 1 for i in item[1:-1])]

这是做到这一点的方法之一。但我几乎可以肯定,您将不得不进行 2 个循环:一个检查要拒绝哪些元素,另一个进行实际过滤。实施可能会有所不同。

于 2013-04-01T19:49:27.853 回答
1

怎么样,使用 defaultdict 来跟踪 head+tail ID,并设置为计数唯一条目:

from collections import defaultdict

a = [[2, 5, 7, 12], [2, 5, 10, 12], [2, 3, 12], [3, 34, 4, 6], [3, 4, 6]]
dic = defaultdict(lambda: set())
for item in a:
    dic[(item[0], item[-1])].add(tuple(item[1:-1]))

for id, variants in dic.items():
     print "ID %s: %i unique entries" % (str(id), len(variants))
于 2013-04-01T19:59:25.577 回答