我有一个列表和一个字符串:
anchors=['a','b']
mystring = 'aerdsbewsabsdsasdbs'
我想遍历mystring
中的每个字母,如果我“打了”一个锚,请跟踪出现在“ prior”之前2个字母和“ post”之后2个字母的字母。
所以我想要的输出将是列表列表,形式为:
[[prior letters, anchor, post letters],
prior letters, anchor, post letters]]
对于每个锚点。使用Counter()
内letters
上的mystring
可以轻松实现这一点,但是我想按平均索引位置对结果输出进行排序。因此,对于每个先前的字母,我想计算在每个锚点的2个字母内它发生的次数,并按锚点的索引位置的平均值进行排序。在我的锚点'a'的示例中,它看起来像:
prior letters = {s:(2,-1), w:(1,-2), d:(1,-2)}
anchor = 'a'
post letters = {e:(1,1), r:(1,2), b:(1,1), s:(2,1.5), d:(1,2)}
其中每个前/后字母的键值对均采用以下格式:
letter:(count,avg_index)
字母=滑动窗口2内的字母count =每个锚点在滑动窗口中字母出现的次数avg_index =字母相对于每个锚点的平均索引位置,例如(-1.5)表示字母出现在位置-1和-2处,平均值为-1.5。我正在努力完成代码,是否可以使用更好的数据结构来提供帮助?
不是完整的答案,但评论范围太窄。我已经测试过此代码:
import pandas as pd
anchors=['a','b']
mystring = 'aerdsbewsabsdsasdbs'
df = pd.DataFrame(columns=['letter', 'match_anchor', '2_letters_before', '2_letters_afer'])
for letter in mystring:
df = df.append( pd.DataFrame([[letter, letter in anchors]], columns=['letter', 'match_anchor']) )
df['2_letters_before'] = df['letter'].shift(2)
df['2_letters_afer'] = df['letter'].shift(-2)
df = df[df['match_anchor'] == True]
df = df.reset_index(drop=True)
print(df)
输出为:
letter match_anchor 2_letters_before 2_letters_afer
0 a True NaN r
1 b True d w
2 a True w s
3 b True s d
4 a True d d
5 b True s NaN
重点是我不了解您的数据。根据当前的输出,我想我已经接近您的期望。但是,您能否进一步解释所需的预期输出?例如,数字(2,-1)对字母's'/ anchor'a'意味着什么?
prior letters = {s:(2,-1), w:(1,-2), d:(1,-2)}
anchor = 'a'
post letters = {e:(1,1), r:(1,2), b:(1,1), s:(2,1.5), d:(1,2)}