簡體   English   中英

給定扁平列表中的索引,獲取原始列表項的索引

[英]Given an index in a flattened list, get the index of the original list item

我從像["ONE","TWO","THREE","FOUR"]這樣的單詞列表開始。

后來,我將列表展平以生成一個字符串: "ONETWOTHREEFOUR" 我在查看這個字符串時做了一些事情並得到一個索引列表,比如[6,7,8,0,4] (它映射到那個字符串上給我“THROW”這個詞,盡管正如評論中指出的那樣與我的問題無關)。

現在我想知道原始列表中的哪些項目給了我用來表達我的話的字母。 我知道我使用了連接字符串中的字母[6,7,8,0,4]

基於該字符串索引列表,我想要輸出[0,1,2] ,因為扁平字符串中的索引678落在原始列表中索引2處的單詞內,索引0來自單詞 at索引0和索引4位於索引1處的單詞內。 我的輸出不包括3 ,因為我使用的所有索引都不屬於最后一個四字符的單詞。

到目前為止我嘗試過的:

wordlist = ["ONE","TWO","THREE","FOUR"]
stringpositions = [6,7,8,0,4]
wordlengths = tuple(len(w) for w in wordlist) #->(3, 3, 5, 4)
wordstarts = tuple(sum(wordlengths[:i]) for i in range(len(wordlengths))) #->(0, 3, 6, 11)

words_used = set()
for pos in stringpositions:
    prev = 0
    for wordnumber,wordstart in enumerate(wordstarts):            
        if pos < wordstart:
            words_used.add(prev)
            break
        prev = wordnumber

它似乎非常冗長。 我這樣做的最佳(和/或最 Pythonic)方式是什么?

這是最簡單的方法。 如果您想更節省空間,您可能需要使用某種二叉搜索樹

wordlist = ["ONE","TWO","THREE","FOUR"]
top = 0
inds = {}
for i,word in enumerate(wordlist):
    for k in range(top, top+len(word)):
        inds[k] = i
    top += len(word)

#do some magic
L = [6,7,8,0,4]
for i in L: print(inds[i])

輸出:

2
2
2
0
1

如果您願意,您當然可以在輸出上調用set()

正如評論中所闡明的那樣,OP 的目標是根據使用的字符串位置來確定使用了哪些單詞,而不是使用了哪些字母——因此單詞/子字符串THROW基本上是無關緊要的。

這是一個非常簡短的版本:

from itertools import chain

wordlist = ["ONE","TWO","THREE","FOUR"]
string = ''.join(wordlist) # "ONETWOTHREEFOUR"
stringpositions = [6,7,8,0,4]

# construct a list that maps every position in string to a single source word    
which_word = list(chain( [ii]*len(w) for ii, w in enumerate(wordlist) ))

# it's now trivial to use which_word to construct the set of words 
# represented in the list stringpositions
words_used = set( which_word[pos] for pos in stringpositions )

print "which_word=", which_word
print "words_used=", words_used

==>

which_word= [0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3]
words_used= set([0, 1, 2])

編輯:更新為使用list(itertools.chain(generator))而不是sum(generator, [])如@inspectorG4dget 在評論中的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM