列表列表中的唯一列表,其中第一个和最后一个值是固定的Python

时间:2013-04-01 19:43:57

标签: python

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

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

[[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中执行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分: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个循环:一个用于检查要拒绝的元素,一个用于实际过滤。实施可能会有所不同。

答案 1 :(得分:1)

如何使用defaultdict跟踪head + tail ID,并设置为tally唯一条目:

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