我有一个嵌套列表,每一个元素都有不同的长度:
lst = [[a,bcbcbcbcbc],[e,bbccbbccb],[i,ccbbccbb],[o,cbbccbb]]
我的输出是一个csv数据帧,外观如下:
comparison similarity_score
a:e *some score
a:i *some score
a:o *some score
e:i *some score
e:o *some score
i:o *some score
我的代码:
similarity = []
for i in lst:
name = i[0]
string = i[1]
score = 0.0
length =(len(string))
for i in range(length):
if string[i]==string[i+1]:
score += 1.0
new_score = (100.0*score)/length
name_seq = name[i] + ':' + name[i+1]
similarity.append(name_seq,new_score)
similarity.pdDataFrame(similarity, columns = ['comparison' , 'similarity_score'])
similarity.to_csv('similarity_score.csv')
但我收到一个错误:
if codes[i]==codes[i+1]:
IndexError: string index out of range
有什么建议吗?谢谢!你知道吗
我认为您最大的问题是,在顶层,您只是一次迭代一对
name,string
,而不是您希望在输出中看到的一对name,string
(如成对的名称a:e
所示)。你知道吗稍后您将尝试索引
name
和string
值,但这样做并没有达到您想要的效果(将两个字符串相互比较以计算分数),因为您只访问同一字符串中的相邻字符。你得到的例外是因为i+1
可能会离开字符串的末尾。由于使用i
表示内部循环中的索引和从外部循环中获取的项(即name, string
对),因此会有进一步的混淆。你知道吗要获得成对的,我建议使用
itertools.combinations
:现在可以在循环的其余部分使用两个名称和两个字符串变量。你知道吗
我不完全确定我是否理解你想要如何比较这些字符串来得到你的分数,因为它们彼此的长度不同。如果只想比较字符串的初始部分(忽略较长字符串的尾随位),可以使用
zip
来获取两个字符串之间的对应字符对。然后可以在生成器表达式中比较它们并将bool
结果相加(True
是整数1
的特殊版本,False
是0
的版本)。然后可以除以字符串长度中的较小值(如果要惩罚长度差异,则可以除以较大值):还有一个更明显的问题,就是用两个参数调用
append
。如果您真的想附加一个2元组,则需要一组额外的括号:根据Python的文档
range
通过示例执行以下操作:在代码中(假设变量名没有更改):
换句话说,给定一个输入
bcb
,if语句将查看以下索引:(0,1)
(1,2)
(2,3)
<
本例中的3是您的问题。你知道吗要解决问题,请从
[0, len(string) - 1]
迭代相关问题 更多 >
编程相关推荐