2016-11-22 64 views
-1

我有一些數據列表,例如什麼是pythononic切片集的方式?

some_data = [1, 2, 4, 1, 6, 23, 3, 56, 6, 2, 3, 5, 6, 32, 2, 12, 5, 3, 2] 

,我想用固定長度(我不在乎,我會得到)獨特的價值觀,我也希望它是set對象。

我知道我能做到setsome_data然後使它list,裁剪,然後使其再次set

set(list(set(some_data))[:5]) # don't look so friendly 

我明白,我沒有在set__getitem__方法,該方法不會使整個片的事情可能,但如果有一個機會,使它看起來更好?

我完全明白set是無序的。因此,最終set將獲得哪些元素無關緊要。

可能的選項是使用:

  • ordered-set
  • 使用dictNone值:

    set(dict(map(lambda x: (x, None), some_data)).keys()[:2]) # not that great 
    
+0

什麼是這樣做的目的是什麼? – jprockbelly

+0

從大的數據列表中獲取具有固定長度的'set'對象的目的。然後使用這個集合(檢查值是否在'set'中)。 –

回答

3

集是迭代。如果你確實不關心你的集合中的哪些項目被選中,你可以使用itertools.islice來獲得一個迭代器,它將產生指定數量的項目(無論哪個迭代順序最先)。通過迭代器到set構造函數,你有你的子集,而無需使用任何額外的列表:

import itertools 

some_data = [1, 2, 4, 1, 6, 23, 3, 56, 6, 2, 3, 5, 6, 32, 2, 12, 5, 3, 2] 
big_set = set(some_data) 
small_set = set(itertools.islice(big_set, 5)) 

雖然這是你問什麼,我不知道你應該使用它。集合可以以非常確定的順序進行迭代,因此如果數據通常包含許多類似的值,那麼每次執行此操作時最終都會選擇一個非常相似的子集。當數據由整數組成時(這在例子中),這對於他們自己來說是非常糟糕的。迭代一個集合時,連續的整數會頻繁出現。使用上面的代碼,只有32big_set(使用Python 3.5)中出現故障,所以small_set{32, 1, 2, 3, 4}。如果您將0添加到您的數據中,即使數據集數量變大,您幾乎總是會以{0, 1, 2, 3, 4}結尾,因爲這些值將始終填滿該組哈希表中的前五個位置。

爲了避免這種確定性採樣,您可以使用random.sampleas suggested by jprockbelly

+0

真棒,想到約'islice',但後來我切換到'這需要'__getitem__',然後忘記了'islice' slice'對象。好點子! –

2

你可以品嚐一套

import random 
set(random.sample(my_set, 5)) 

這樣做的好處,你會每次

+0

相當一個選項,但需要將其轉換爲'set',我需要運行一些timeit明白,如果它的速度更快。 –

+0

好一點,看編輯 – jprockbelly

+1

以隨機抽樣是不是會比切片更快。 「random.sample」實現所做的第一件事情之一是將它的參數複製到列表中,如果它是一個集合(然後它從列表中抽樣)。無論如何,使用'sample'可能是值得的。這將避免總是你的子集得到相同的值(套可以在非隨機順序重複,例如套連續小整數以便經常)。 – Blckknght

1

得到不同的數字你可以嘗試一組簡單的理解:

some_data = [1, 2, 4, 1, 6, 23, 3, 56, 6, 2, 3, 5, 6, 32, 2, 12, 5, 3, 2] 
n = {x for i, x in enumerate(set(some_data)) if i < 5} 
print n 

輸出:

set([32, 1, 2, 3, 4])

相關問題