我有一份清单清单;每个列表都有规定的第一个和最后一个值。对于每个第一个和最后一个值组合,我想找到唯一列表的总数。定义唯一性,使得具有相同的第一个和最后一个值组合的列表之间的列表中间(第一个值和最后一个值之间)不能重复元素。
例如,对于以下列表列表;
[[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中执行此操作的最佳方法是什么?
答案 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))