Python 查找字符串中每个字母的所有索引
我试图得到一个列表,其中包含另一个序列中每个项目的索引。 理论上听起来很容易Python 查找字符串中每个字母的所有索引,python,string,list,Python,String,List,我试图得到一个列表,其中包含另一个序列中每个项目的索引。 理论上听起来很容易 a = 'string of letters' b = [a.index(x) for x in a] 但它不起作用。我尝试过列表理解,对于循环简单,使用枚举等,但每次b都会返回相同的索引,用于a中的重复项。 也就是说,例如,a中的“s”将在b中为第一项和最后一项返回“0”,因为它们是相同的字符。 我猜是缓存或者类似的东西作为Python加速的一种方式 在任何情况下,我都无法理解这一点,我希望能得到一些帮助,帮助我如
a = 'string of letters'
b = [a.index(x) for x in a]
但它不起作用。我尝试过列表理解,对于循环简单,使用枚举等,但每次b都会返回相同的索引,用于a中的重复项。
也就是说,例如,a中的“s”将在b中为第一项和最后一项返回“0”,因为它们是相同的字符。
我猜是缓存或者类似的东西作为Python加速的一种方式
在任何情况下,我都无法理解这一点,我希望能得到一些帮助,帮助我如何使这项工作以及解释为什么会发生这种情况
.index
只返回字符串中第一个出现的字符-这与缓存无关。似乎您只需要从0到字符串长度-1的数字列表:
b = list(range(len(a)))
您没有提到为什么需要这个,但是在Python中很少需要这样的东西。注意:在Python 3中,range返回一个特殊类型的数组,它本身表示一个不可变的数字序列,因此如果确实需要,您需要显式地将其转换为一个列表。一种方法可以是构建一个字典,迭代字符串中的不同字母,并使用以获取字符串中所有出现项的索引。因此,一步一步:
import re
a = 'string of letters'
我们可以通过获取集合来查找字符串中的唯一字母:
letters = set(a.replace(' ',''))
# {'e', 'f', 'g', 'i', 'l', 'n', 'o', 'r', 's', 't'}
然后我们可以使用字典理解来构建字典,其中的值是通过迭代re.finditer
返回的所有匹配实例生成的列表:
{w: [m.start() for m in re.finditer(w, a)] for w in letters}
{'i': [3],
'o': [7],
'f': [8],
'l': [10],
'g': [5],
'e': [11, 14],
't': [1, 12, 13],
's': [0, 16],
'n': [4],
'r': [2, 15]}
听起来像是在试图获取每个输入字符的索引列表 输出。因此,对于
s
,您将得到[0,16],或者类似于这些行的东西
因此,对于每个输入字符,您可以将其位置添加到右侧列表中
将结果存储在dict中似乎是一种很好的方法,因此:
def index_dict(stringy):
d = {}
for index, char in enumerate(stringy):
if char not in d:
d[char] = []
d[char].append(index)
return d
index()
方法始终查找第一个匹配项。您需要查找所有事件。因此,上面的func将为您提供一个dict,其中所有键都与输入字符串的字符匹配,然后每个键的值都是找到该字符的索引列表 在这方面,dict可能比列表更好:
foo = {x : [] for x in a} #creates dict with keys being unique values in a
for i,x in enumerate(a):
foo[x].append(i) #adds each index into dict
例如字符串'abababababa'
:
{'a': [0, 2, 4, 6, 8], 'b': [1, 3, 5, 7, 9]}
非常感谢你的投入。实际上,我是用enumerate算出的。 为了详细说明,我有两个列表,a和b。a同时包含大写和小写字符。b由与a相同的字符组成,但移动了一定数量的位置,就像在密码中一样。 我想在“编码”之后,将b中字符的大小写保持在相同的位置,但我需要“A”中每个字符的索引 总之,事情就这么简单:
a = 'tEXt'
c = [x for x,y in enumerate(a) if y.isupper()]
b = ['x', 't', 't', 'e'] #(this is the encoded version of 'a', returned from a different place as a string, but converted here to a list)
for x in c:
b[x] = b[x].upper()
b = ''.join[b]
b
'xTTe'
我重构了你作为答案发布的代码,如果我理解正确,请告诉我 输入导入列表中的
def copy_案例(a:str,b:str)->str:
res_chars:List[str]=[]
货币:str
货币:str
对于邮政编码为a、b的货币:
如果当前值为上限():
当前值=当前值上限()
其他:
当前值=当前值较低()
资源字符附加(当前)
返回“”。加入(res_chars)
打印(复制大小写('tEXt','xTTe'))
你能澄清你想做什么吗?@usr2564301done@AMC一种凯撒密码,根据特定的字符移位(3、4、7等字符的移位)对文本进行“编码”。但是我已经这样做了,结果是以小写形式返回的,并且希望以某种方式使输入中的大写字符与输出中的大写字符保持一致啊,这似乎与您的文章的其余部分有很大的不同。上面的索引问题是如何解决的呢?我构建了一个函数,它包含两个参数:初始输入文本('a'),它保留大写字符,另一方面,编码的结果是所有字符都是小写的(比如,'c')。(我已经写了所有这些,没有时间修改太多,所以需要一些快速且集中在一个地方的东西)。因此,函数扫描“a”,记录每个大写字符的位置,并将所有相应的索引放入列表“b”。然后该函数扫描“c”列表,并根据索引修改它,在需要时执行.upper()。“.index只返回字符串中第一个出现的字符-这与缓存无关。”--所以就是这样。非常感谢。Python 3range
不是生成器范围类型表示不可变的数字序列
。例如,我可以做>>范围(1,10,2)[2]
,这是我一年内做不到的generator@jamylak你说得对,似乎我有一个长期的误解。编辑此内容,谢谢。下次试着问清楚你想做什么,你的问题可能会被更好地接受,答案也会更具体。例如,你的b
似乎只需要一个理解。我认为拉链非常适合你this@Daniel是的,zip()
是一个非常实用的函数,非常适合这样的并行迭代。