[英]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]
,因為扁平字符串中的索引6
、 7
和8
落在原始列表中索引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.