2016-11-04 69 views
4

我知道,set() python沒有訂單,因爲它是作爲一個哈希表實現的。然而,我有點驚訝地解決了一個涉及使用set.intersection()的命令的問題。令人驚訝的蟒蛇組合方法訂單

因此,我給出了兩個列表的順序,例如說,表示一些排名或發生順序。我必須找到兩個列表中共同的元素,並且在兩個列表中具有最高的順序(發生在第一個)。例如,

List1 = ['j','s','l','p','t'] 
List2 = ['b','d','q','s','y','j'] 

應該輸出's'因爲它是在List1第二好的並且發生在List2第一個。

如果您將每個列表轉換爲集合並採用路口Set1.intersection(Set2),則會得到一組set(['s', 'j'])。在我的情況下,我可以將其轉換爲列表並吐出第一個元素,這大約是O(n1 + n2)。

我很高興解決這個面試問題(所有測試都通過了),但我很驚訝,我怎麼能用python set來解決這樣的訂單基礎問題。

有沒有人有線索如何工作?什麼是可能的情況,這可能會崩潰?

編輯:這似乎是一樣的運氣盒的行程,所以如果你有這個問題的很好的解決方案,這將是還讚賞

+0

只是不依賴'set'的順序。它可以根據python的版本進行更改。 –

+0

我同意它似乎是虛假的。我只是想知道在這種情況下它是如何工作的。什麼樣的測試用例可以分解我的代碼,這在自動化測試用例中並不出乎意料。 –

+6

「它是如何工作」的答案是「運氣」。套裝無序的事實並不意味着他們永遠不會給你你想要的訂單。這意味着你永遠不知道他們會給你什麼樣的順序。 – BrenBarn

回答

0

列表解析可以做的工作:

Set2 = set(List2) 
[x for x in List1 if x in Set2] 

這將保持List1的順序,您也可以對List2執行相同的操作。

然後,您可以在清單理解(或生成器更高效)上撥打next以獲得第一個匹配。

+0

正如我所提到的,我知道一種方法來解決問題 Set1 = set(List1) Set2 = set(List2) ans = list( Set1.intersection(Set2))[0] 它工作。我不知道怎麼樣? –

+0

@AseemDua>不,你不需要轉換這兩個列表,只是你用於包含測試的一個列表(甚至這並非絕對必要,它只是更有效) – spectras

+1

這個想法是_not_轉換爲'set'否則可能會失去訂單。 –

1

我找到了一個O(n1+n2)的方法。評論代碼如下。訣竅是創建一個查找表(而不是一個字典,一個簡單的數組)來索引兩個列表中的字母的最小位置,然後找到這些位置和相關字母之和的最小值。

List1 = ['j','s','l','p','t'] 
List2 = ['b','d','q','s','y','j'] 

# unreachable max value to initialize the slots 
maxlen = max(len(List1),len(List2))+1000 

# create empty slot_array (initialized to values higher than last letter pos 
# for both lists (the value is greater than any "valid" position) 
# first pos (index 0) is for letter "a", last pos is for letter "z" 

slot_array = [[maxlen,maxlen] for x in range(ord('a'),ord('z')+1)] 

# scan both lists, and update the position if lower than the one in slot_array 
for list_index,the_list in enumerate((List1,List2)): 
    print(list_index) 
    for letter_index,letter in enumerate(the_list): 
     slot = slot_array[ord(letter)-ord('a')] 
     if slot[list_index]>letter_index: 
      slot[list_index] = letter_index 

# now compute minimum of sum of both minimum positions for each letter 
min_value = maxlen*2 

for i,(a,b) in enumerate(slot_array): 
    sab = a+b 
    if sab < min_value: 
     min_value = sab 
     min_index = i 

# result is the letter with the minimal sum 
print(chr(min_index+ord('a'))) 
+0

這是一個很好的策略!事後看來,我最初嘗試使用set是爲了查找表。因爲我知道我不得不「,看看它」。我被給了15分鐘來解決它。到我找到路口的時候。我迅速跳起來提交答案。 但說實話,這個問題有字符串而不是字符。我由於NDA而被抽象化。是一個直觀的字符串查找表? –

+0

哦,看起來你的[mcve]實在太少了:)在15分鐘內,我可以想出一個糟糕的O(n ** 2)雙循環。對於字符串,它需要使用字典,但我認爲它可以以相當類似的方式完成。如果你願意,我可以去看看。 –

相關問題