我必须创建这个函数,它具有String和字符串列表作为输入;并作为输出包含String的字符串索引的列表。我已经完成了,但是我应该根据字符串中String的出现来纵断索引。我怎样才能做到这一点?这是我的代码: 我添加了' count'在'如果'为了计算事件的数量,我如何根据它来使用它来指数?
答案 0 :(得分:1)
您可以在每个字符串中添加一个计数列表到您的函数
def function(s,lst):
l=[]
counts = []
for i in range(len(lst)):
if s in lst[i]:
counts += [lst[i].count(s)]
l += [i]
return l, counts
此处counts
是一个列表,其中每个条目是输入列表中字符串中s
的出现次数。该函数现在在元组中返回两个列表,例如第一个元组元素为l
,第二个元素为counts
。请注意,i=-1
在此处是多余的,因为i
是使用range
进行迭代的元素,并在循环未更改循环之前为其指定值值。
现在,您可以使用从this帖子修改的行
,根据第二个列表对第一个列表进行排序out_fun = function(s,inp)
out = [x for x,_ in sorted(zip(out_fun[0],out_fun[1]), key = lambda x: x[1], reverse=True)]
inp
是字符串列表,例如inp = ["hello", "cure", "access code"]
。 out_fun
是函数function
中两个列表的返回元组。 s
是感兴趣的字符串 - 在原始示例中为'c'
。
这一行的作用是它首先使用zip
创建一个元组列表,其中元组的每个第一个元素是索引列表中的元素,第二个元素来自出现列表。然后程序以相反的顺序(最大的第一个)基于第二个元素对元组进行排序。列表推导仅从排序结果中的每个元组中获取第一个元素,这也是索引列表。
如果您对此解决方案有疑问,请随时提出。你有一个Python 2.7标签 - 在Python 3.X中你需要使用list(zip())
,因为zip
返回一个zip对象而不是列表。
这是您程序的更简洁版本:
def function(s,lst):
t = [(i,x.count(s)) for i,x in enumerate(lst) if s in x]
return t
它使用列表推导来创建并返回元组t
的列表,其中第一个元素是具有字符s
的字符串的索引,第二个元素是计数。这不一定更有效,需要检查。但它是一个干净的单行,至少对我来说更具可读性。
元组列表可以按照与前一个程序类似的方式排序,基于第二个元组元素,即count,
out_fun = function(s,inp)
out = [x for x,_ in sorted(out_fun, key = lambda x: x[1], reverse=True)]