根据事件的出现来调整元素的问题

时间:2017-11-11 17:30:35

标签: python python-2.7

我必须创建这个函数,它具有String和字符串列表作为输入;并作为输出包含String的字符串索引的列表。我已经完成了,但是我应该根据字符串中String的出现来纵断索引。我怎样才能做到这一点?这是我的代码: 我添加了' count'在'如果'为了计算事件的数量,我如何根据它来使用它来指数?

1 个答案:

答案 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)]