python中列表中列表的唯一元素

时间:2013-10-20 21:23:59

标签: python list set enumerate

我们获得了不同动物园中的动物清单,需要找到哪些动物园中有动物不在其他动物园中。每个动物园的动物用空格分开,每个动物园最初用逗号分隔。

我目前正在枚举所有动物园以分割每只动物,并在不同动物园的列表中创建列表:

for i, zoo in enumerate(zoos):
    zoos[i] = zoo.split()

然而,我当时不知道怎么分辨和计算有多少动物园有独特的动物。我认为它是enumerate的其他东西,可能是设置,但不能完全降低它。

4 个答案:

答案 0 :(得分:0)

我认为set是您正在寻找的。

您可以添加和减去集合,找到它们的交叉点 所以你需要找到动物园里有哪些动物的物品不是其他动物园的联合动物组。如果你将从动物园中的动物中减去所有其他动物你就会得到独特的动物。

zoos = ['mouse,dog', 'dog,tiger,mouse', 'mouse,cat']
for zoo in zoos:
    zoo_animal = set(zoo.split(','))
    other_zoo_animals = set(animal for z in zoos if z != zoo for animal in z.split(','))
    unique_animals = zoo_animal - other_zoo_animals
    if unique_animals:
       print "%s: %s" % (zoo, unique_animals)

或者你可以找出每只动物的生活地点:

zoos = ['mouse,dog', 'dog,tiger,mouse', 'mouse,cat']
animals = {}
for i, zoo in enumerate(zoos):
    zoo_animal = set(zoo.split(','))
    for animal in zoo_animals:
        animals.setdefault(animal, []).append(i)
# Now You can iterate over all animals and find ones which are only present in one zoo
for animal, zoo_list in animals.iteritems():
    if len(zoo_list) == 1:
        print("% lives in %s only" % (animal, zoo_list[0]))

答案 1 :(得分:0)

你应该使用套装。

一个集合只有唯一的项目,每当你想到列表中的唯一项目时,你应该想到集合。

使用特定动物园的动物创建一个集合A,并与所有其他动物创建集合B. 然后迭代去除A中的A中的每一只动物。 结果将是独特的例子。

试试这个:

def unique_animals(zoo, list_of_zoos):
    animals_in_other_zoos = set()
    for element of list_of_zoos:
        animals_in_other_zoos.add(set(element))
    unique_animals = set(zoo)
    for element in unique_animals:
        if element in animals_in_other_zoos:
            unique_animals.remove(element)
    return unique_animals

我可以对我们的案例做一些更有用的事情,但我需要你的一些代码。

答案 2 :(得分:0)

你也许可以用一套,但你真的不需要。您需要考虑如何组织数据,即数据结构。

这是一种方法:要找出只在一个动物园中存在的动物,你需要一个清单,为每只动物提供拥有它的动物园。因此,为每只动物构建一个动物园列表(我会使用字典来保存动物名称,但即使是常规列表也会这样做),然后只看每只动物并选择仅列出一个动物园的动物。 / p>

答案 3 :(得分:0)

如果我理解你,你会得到一个这样的字符串:

input_date = 'dog dog mouse cat, dog pidgin elephant, zebra cat lion'
zoos = input_date.split(',')

for zoo in zoos:
    zoo_animal = set(zoo.split())
    other_zoo_animals = set(animal for z in zoos if z != zoo for animal in z.split())
    unique = zoo_animal - other_zoo_animals
    if unique:
       print "%s: %s" % (zoo, animals)