【问题标题】:How to index string within array?如何在数组中索引字符串?
【发布时间】:2017-05-26 22:24:18
【问题描述】:

我正在尝试获取数组中字符串的索引。

这样做最合适和最快捷的方法是什么?

【问题讨论】:

  • 你为什么用python 2而不是3来编程?
  • @knurzl - 这又与这个问题有什么关系?
  • @knurzl 你什么意思?有一个比另一个更好吗?
  • 我只是感兴趣,因为我用 3 编程,因为它更新了

标签: arrays list substring


【解决方案1】:

假设你的主列表是:your_arr,多子串列表是:multiple

def find_multiple_substring(your_arr, multiple):
    res = [i for i, item in enumerate(your_arr) if all(x in item for x in multiple)]
    return res[0] if res else -1

你可以这样称呼它:

x = ["pink-one", "pink-two", "pink-three", "pink-four"]
y = ["pink", "one"]  # For a search to be successful, all of these
                     # strings should be present in `x`.
find_multiple_substring(x, y)   # returns 0

【讨论】:

  • 你的方法比别人快吗?如果是这样,您介意为学习目的解释逻辑吗?提前谢谢你
  • 它在 O(mn) 中运行,并且与发布的其他答案非常相似,如果这回答了您的问题..
【解决方案2】:

使用新方法从list 继承的类怎么样?

class DualIndexList(list):
    def dual_index(lst, first, second):
        for ix, l in enumerate(lst):
            if first in l and second in l:
                return ix
        return -1

mylist = DualIndexList(["pink-one", "pink-two", "pink-three", "pink-four"])

print mylist.dual_index("pink", "one")

结果:0

你也可以让它无限扩展:

class NthIndexList(list):
    def nth_index(lst, *args):
        for ix, l in enumerate(lst):
            count = 0
            arglength = len(args)
            for arg in args:
                if arg in l:
                    count += 1
                else:
                    continue
                if count == arglength:
                    return ix
        return -1

mylist = NthIndexList(["pink-one-a", "pink-two-b", "pink-three-c", "pink-four-d"])

print mylist.nth_index("pink", "one", "a")

结果:0

【讨论】:

  • 它不适用于整数列表吗?如何将列表中的每个元素都转换为字符串?
  • 您可以将列表项转换为这样的字符串:newlist = [str(i) for i in oldlist]
【解决方案3】:

您可以进行列表推导以返回所有此类实例:

>>> a = ["pink-one", "pink-two", "pink-three", "pink-four"]
>>> q = "one"
>>> sub_indices = lambda query,lib: [i for i,x in enumerate(lib) if query in x]
>>> sub_indices(q,a)
[0]
>>>

【讨论】:

  • 如果要将其分配给名称,请不要使用 lambdalambda 今天的重点是创建一个 anonymous 函数。在这种情况下使用def 语句。
  • 但是它非常紧凑,如果你只需要它的两倍就可以了。
  • @knurzl 它明确反对 PEP8。但随心所欲
【解决方案4】:

如果您只想匹配第一个结果,我认为这将是最简单的方法:

lst = [“pink-one”, “pink-two”, “pink-three”, “pink-four”]

print(lst.index([x for x in lst if 'one' in x][0]))

另一种选择是 lambda:

print(list(filter(lambda x: 'one' in x, lst))[0])

【讨论】:

    【解决方案5】:

    一种查找包含您要查找的子字符串的一个索引或所有索引(索引)的有效方法。

    def index_with_substrings(l, substrings):
      return next(indexes_with_substrings(l, substrings), None)
    
    def indexes_with_substrings(l, substrings):
      for i, element in enumerate(l):
        if all(substring in element for substring in substrings): 
          yield i
      raise StopIteration()
    
    
    l = ['pink-one', 'pink-two', 'pink-three', 'pink-four']
    print(index_with_substrings(l, ['pink', 'one']))    # 0
    print(index_with_substrings(l, ['pink', 'three']))  # 2
    print(index_with_substrings(l, ['pink', 'five']))   # None
    print(list(indexes_with_substrings(l, ['pink'])))   # [0, 1, 2, 3]
    

    <script src="//repl.it/embed/ITuU/0.js"></script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-16
      • 2016-05-24
      • 2017-08-16
      • 2011-07-22
      • 2012-01-20
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多