2011-10-27 74 views
2

所以我有一個列表,它是這樣的:查找列表內的小名單的確切位置(蟒蛇)

list=[10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 9.9, 9.9, 9.9, 10.0, 10.0, 10.0, 10.2, 10.0, 9.9, 9.9, 9.9, 9.9, 10.0, 10.2, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.2, 10.5, 10.9, 10.5, 10.3, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.4, 10.7, 10.3, 10.2, 10.1, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 9.9, 9.9, 10.1, 9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.7, 9.8, 9.8, 9.7, 9.7, 9.7, 9.7, 9.7, 9.7, 9.6, 9.7] 

然後我也有一個子表看起來是這樣的:

sublist=[9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8]

現在我需要做的這個小小的名單,是我必須找到它位於主列表。 所以在這種情況下,結果應該是這樣的:index = 119(我可能會關閉+/- 1)

我一直試圖做這一整天......並沒有發現任何web ... 我有幾個想法:

1)我找到名單上的第一個項目....在這種情況下,這將是4,所以我檢查下一個數字也是正確的然後下一個會出錯,它會發送它在剩下的列表[4:]中找到另一個9.9,並再次做同樣的循環...直到找到完全匹配爲止

2)然後,另一個想法是以某種方式使用字符串 str( list)[1:-1] .find(str(sublist)[1:-1]),在這種情況下會給出答案687 ...

這些想法的問題在於它們似乎是長和草率,也是我一直沒能做出這些工作思路...

回答

3

如何:

l = [10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 9.9, 9.9, 9.9, 10.0, 10.0, 10.0, 10.2, 10.0, 9.9, 9.9, 9.9, 9.9, 10.0, 10.2, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.2, 10.5, 10.9, 10.5, 10.3, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.4, 10.7, 10.3, 10.2, 10.1, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 9.9, 9.9, 10.1, 9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.7, 9.8, 9.8, 9.7, 9.7, 9.7, 9.7, 9.7, 9.7, 9.6, 9.7] 
subl = [9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8] 
for i in xrange(len(l)-len(subl)): 
    if l[i:i+len(subl)] == subl: 
    print 'found at pos', i 
    break 
else: 
    print 'not found' 

這將打印found at pos 118

P.S.我已將這些變量重命名,以便list不會影響內置函數。

+0

哇! 這真是太棒了! 嚴重的是,這正是我所需要的......這很簡單,但也有工作......太糟糕了,我沒有想到這個 謝謝! –

1

你的第二個想法可能會帶來誤判:如果子列表是單個值,比如1,而完整列表只有值11,則會找到匹配項。如果您在字符串中添加了前導分隔符和尾隨分隔符,可以避免這種情況。

你的第一個想法是最佳解決方案的一半;有一個算法(現在的名字讓我不知道)決定你可以「重複使用」的子字符串的多少,這樣你就不必在完整的字符串中回溯。例如,假設你當前的候選人失敗了,因爲你發現了一個9.9,你期望得到9.8;您不需要重新訪問該元素,因爲它匹配子字符串的第一個元素。這些可以預先計算,所以你最終只需要一次遍歷整個列表。

+0

Intersting想到了第一個...很好的例子.. 第二個應該工作是的,我想... 謝謝你的答案.. –

2
ind = l.index(subl[0]) 
for i in xrange(l.count(subl[0])-1): 
    if l[ind:ind+len(subl)] == subl: 
     print (ind) 
     break; 
    ind = l.index(subl[0],ind+1) 

這是一種有效的方式,當它知道至少subl第一值存在將僅比較。

1
idx = next(i for i in range(len(lst)-len(sublst)) if lst[i:i+len(sublist)] == sublst) 
# 118