2014-12-07 133 views
0

對於像一些數據:如何正確使用Python3地圖?

foo = list() 
foo.append(["a", "b", "c"]) 
foo.append(["d", "e", "f"]) 
foo.append(["g", "h", "i"]) 

我可以使用map(shuffle, foo)的Python 2洗牌FOO的每個子表,並取回從地圖列表。

Python 3 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 

爲什麼做的第一件事不要洗牌Foo的元素,但第二個呢?

回答

2

根據the docs隨機洗牌將就地洗牌,這意味着該函數將返回None

在你的列表構造函數和理解範例中,你創建的列表是你的shuffle函數調用返回的None的列表。如果您要再次重複foo,則應該對其進行洗牌。

在你的第二個到最後一個例子中,你說map()「什麼都不做」,並且元素保持相同的順序,這只是因爲執行shuffle函數一直延遲到你試圖遍歷返回值您的來電地圖:

new_iterator = map(shuffle, foo) 
for element in new_iterator: 
    pass 

在這段代碼中,每個元素將像您觀察的那樣是None。但是迭代映射將返回的生成器的行爲將導致shuffle函數實際執行,並且如果再次查看foo,現在應該洗牌。

最後說明:我上面寫的片段是一種愚蠢的方式來做你想做的事情。仍然完成你在一行中想要的東西,你可以做一個列表理解,和剛剛扔掉的Nones名單:

[shuffle(element) for element in foo] 

結果列表中不分配到任何東西。如果再看一下foo,應該洗牌子列表。

+0

好的,謝謝。我可以以某種方式對列表foo進行洗牌,而不是最終得到幾行代碼或像rightfolds回答中的新方法my_shuffle? – daniel451 2014-12-07 00:39:22

+0

@ascenator請參閱編輯。使用顯示的列表理解而不將結果列表分配給任何東西。 – skrrgwasme 2014-12-07 00:51:42

+0

謝謝,這解決了問題:) – daniel451 2014-12-07 00:56:27

2

shuffle洗牌清單就地並且由命令查詢分隔原則返回None而不是列表。你可以用它像這樣:

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

這將使輸入列表不變,並返回其洗牌的新列表。

+0

Ahh沒有仔細閱讀問題。 – Dair 2014-12-07 00:33:54