-2

我有一个列表列表,它是从 itertools 产品附加一些其他结果的结果。我想要的是能够使用 for 循环访问列表列表中列表的每个元素,但我无法访问所有元素。我只能访问最后一个列表的元素。结果是一个非常大的列表列表,例如: [[1,2,],[4,3,6,19][2,0,34,9,9].........[n ]]。我希望能够访问 for 循环中列表列表中每个列表中的所有元素,但我只获取最后一个列表的元素。Itertools 仅显示内存中元素的位置。

myListofLists=[]                              
from itertools import product
animal = ['dog','cat']
number = [5,45,8,9]
color = ['yellow','blue','black']
myProduct = product(animal, number, color):
myListOfLists.append(myProduct)
for item in myListOfList:
   list(items)

这使得结果是这样的:[['dog',5,'yellow']['dog',45,'blue'],.......] 它只显示在外壳中,但我试过了要将结果写入文件,我只能看到最后一个列表的元素。

我的问题是(1)如何访问链表中每个列表的所有元素和(2)除了向我显示内存中元素的位置之外,我如何查看 python shell 中的结果。谢谢!

4

2 回答 2

4

itertools.product本身返回一个可以迭代的对象。例如:

>>> from itertools import product
>>> animal = ['dog','cat']
>>> number = [5,45,8,9]
>>> color = ['yellow','blue','black']
>>> myProduct = product(animal, number, color)
>>> for p in myProduct:
...     print p
...     
('dog', 5, 'yellow')
('dog', 5, 'blue')
('dog', 5, 'black')
[...]
('cat', 9, 'blue')
('cat', 9, 'black')

在此之后,myProduct已用尽(没有要产生的元素),因此如果再次循环,您将一无所获:

>>> for p in myProduct:
...     print p
...     
>>> 

如果你想具体化myProduct到一个列表中,你可以这样做:

>>> myProduct = list(product(animal, number, color))
>>> len(myProduct)
24
>>> myProduct[7]
('dog', 8, 'blue')

通过将对象本身附加product到列表中,您不会得到迭代它会产生的列表,只有对象。

>>> myProduct = product(animal, number, color)
>>> myProduct
<itertools.product object at 0x8e3ce3c>

如果需要,您可以将此对象存储在某处,并以相同的方式从中获取元素:

>>> some_list = [myProduct, myProduct]
>>> next(some_list[0])
('dog', 5, 'yellow')
>>> next(some_list[1])
('dog', 5, 'blue')
>>> next(some_list[1])
('dog', 5, 'black')
>>> next(some_list[0])
('dog', 45, 'yellow')

但是在这里,我认为这不是您要寻找的。

于 2013-07-09T20:47:47.467 回答
2

多次阅读您的帖子,我认为您对这种语法感兴趣:

for animal, number, color in ...:

它允许您访问内部列表中的元素。

import itertools
animals = ['dog', 'cat']
numbers = [5, 45, 8, 9]
colors = ['yellow', 'blue', 'black']
for animal, number, color in itertools.product(animals, numbers, colors):
    print "Animal is {0}, number is {1}, and color is {2}".format(animal, number, color)

看到这个在ideone上运行

编辑:在另一个线程中阅读您的评论,我猜(?)您有兴趣迭代内部元组。您不必将它们转换为列表,您可以简单地迭代它们。

import itertools
animals = ['dog', 'cat']
numbers = [5, 45, 8, 9]
colors = ['yellow', 'blue', 'black']
for triplet in itertools.product(animals, numbers, colors):
    for element in triplet:
        print element

ideone上的演示

编辑 2:您可以为您的分数尝试这种方法。

import itertools
animals = ['dog', 'cat']
numbers = [5, 45, 8, 9]
colors = ['yellow', 'blue', 'black']
general_list = ['horse', 'blue', 'dog', 45]

def give_score(element):
    return 1 if element in general_list else 0

for triplet in itertools.product(animals, numbers, colors):
    print sum([give_score(element) for element in triplet])

演示在这里

于 2013-07-09T20:47:37.140 回答