Python 2.7 如何正确使用Python3地图?

Python 2.7 如何正确使用Python3地图?,python-2.7,python-3.x,map,shuffle,Python 2.7,Python 3.x,Map,Shuffle,对于某些数据,例如: foo = list() foo.append( ["a", "b", "c"] ) foo.append( ["d", "e", "f"] ) foo.append( ["g", "h", "i"] ) 我可以在python2中使用map(shuffle,foo)来洗牌foo的每个子列表,并从map返回一个列表 在Python3map(和许多其他方法一样)中,返回一个对象,在本例中是一个map对象,其中包含一些带值的迭代器(至少我是这么认为的) 所以我尝试了一个列表:

对于某些数据,例如:

foo = list()
foo.append( ["a", "b", "c"] )
foo.append( ["d", "e", "f"] )
foo.append( ["g", "h", "i"] )
我可以在python2中使用
map(shuffle,foo)
来洗牌foo的每个子列表,并从map返回一个列表

Python3map(和许多其他方法一样)中,返回一个对象,在本例中是一个map对象,其中包含一些带值的迭代器(至少我是这么认为的)

所以我尝试了一个列表:

[ element for element in map(shuffle, foo) ]
和列表构造函数:

list( map(shuffle, foo) )
以及一个简单的for循环:

for element in map(shuffle, foo)
但我总是得到这样的东西

[None, None, None]
我不明白为什么?有人能帮我减轻一下吗

除此之外,还有一件奇怪的事:

# simply calling map
map( shuffle, foo ) # <-- does nothing, foo's elements remain in the same order

# saving the output
someThing = map( shuffle, foo ) # <-- foo's elements are shuffled
#只需调用map

map(shuffle,foo)#
shuffle
在适当的位置对列表进行洗牌,并根据命令查询分离原则返回
None
,而不是列表。您可以这样包装它:

def my_shuffle(xs):
    xs = list(xs)
    shuffle(xs)
    return xs

这将使输入列表保持不变,并返回一个被洗牌的新列表。

shuffle
将列表洗牌到位,并根据命令查询分离原则返回
None
,而不是列表。您可以这样包装它:

def my_shuffle(xs):
    xs = list(xs)
    shuffle(xs)
    return xs
这将使输入列表保持不变,并返回一个被洗牌的新列表。

根据洗牌将元素洗牌到位,这意味着函数将返回
None

在列表构造函数和理解示例中,您创建的列表都是从shuffle函数调用返回的
None
s的列表。如果要再次迭代
foo
,则应将它们洗牌

在第二个到最后一个示例中,您说
map()
“什么都不做”,元素保持相同的顺序,这只是因为shuffle函数的执行被推迟,直到您尝试迭代map调用的返回值:

new_iterator = map(shuffle, foo)
for element in new_iterator:
    pass
在这个片段中,每个元素都将像您观察到的那样
None
。但是,在map将返回的生成器上迭代的行为将导致实际执行shuffle函数,如果您再次查看foo,它现在应该被shuffle

最后一点注意:我上面写的代码片段是一种愚蠢的方式来做你想做的事情。要想在一行中完成您想要的内容,您可以进行列表理解,然后扔掉
Nones

[shuffle(element) for element in foo]
不要将结果列表分配给任何对象。如果再次查看
foo
,子列表应该被洗牌。

根据洗牌将洗牌元素,这意味着函数将返回
None

在列表构造函数和理解示例中,您创建的列表都是从shuffle函数调用返回的
None
s的列表。如果要再次迭代
foo
,则应将它们洗牌

在第二个到最后一个示例中,您说
map()
“什么都不做”,元素保持相同的顺序,这只是因为shuffle函数的执行被推迟,直到您尝试迭代map调用的返回值:

new_iterator = map(shuffle, foo)
for element in new_iterator:
    pass
在这个片段中,每个元素都将像您观察到的那样
None
。但是,在map将返回的生成器上迭代的行为将导致实际执行shuffle函数,如果您再次查看foo,它现在应该被shuffle

最后一点注意:我上面写的代码片段是一种愚蠢的方式来做你想做的事情。要想在一行中完成您想要的内容,您可以进行列表理解,然后扔掉
Nones

[shuffle(element) for element in foo]

不要将结果列表分配给任何对象。如果您再次查看
foo
,子列表应该被洗牌。

好的,谢谢。我是否可以以某种方式洗牌列表foo,而不是以几行代码或一种新方法结束我的\u洗牌,如rightfolds answer?@ascenator请参阅编辑。使用显示的列表理解,而不将结果列表分配给任何内容。好的,谢谢。我是否可以以某种方式洗牌列表foo,而不是以几行代码或一种新方法结束我的\u洗牌,如rightfolds answer?@ascenator请参阅编辑。使用显示的列表,而不将结果列表分配给任何对象。