Python 使用字符串搜索列表

Python 使用字符串搜索列表,python,numpy,Python,Numpy,我有一份清单: A = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']] 确切地说,我有三个问题: 如何使用特定元素作为关键字从此列表中检索子列表? 例如,我想检索所有包含“为什么”元素的列表?什么是 最好的方法

我有一份清单:

 A = [['andy', 'dear', 'boy', 'tobe', 'todo'], 
      ['where', 'what', 'when', 'how'], 
      ['korea', 'japan', 'china', 'usa'], 
      ['tweet', 'where', 'why', 'how']]
确切地说,我有三个问题:

  • 如何使用特定元素作为关键字从此列表中检索子列表?
    例如,我想检索所有包含“为什么”元素的列表?什么是
    最好的方法是什么
  • 如何使用特定元素的一部分作为关键字从此列表中检索子列表?
    例如,我想检索所有以“wh”为开头的元素的列表
    任何元素的字符
  • 如何从这两种搜索方法中的任何一种获得结果子列表的位置或索引
  • 我熟悉从与特定关键字匹配的列表中检索所有元素的概念,但在检索与特定关键字匹配的所有列表时会感到困惑


    猜猜看?提前感谢。

    首先:

    >>> for l in A:
    ...     if 'why' in l:
    ...             print l
    ... 
    ['tweet', 'where', 'why', 'how']
    
    sub_list_b = [ el for el in A if any( ['wh' in s for s in el] ) ]
    
    对于秒:(wy任意位置)

    要在开始时进行测试,请尝试以下操作:(使用@Harido中的startswith())

    对于第三方:

    >>> for l in A:
    ...     if 'why' in l:
    ...             print l
    ... 
    ['tweet', 'where', 'why', 'how']
    
    sub_list_b = [ el for el in A if any( ['wh' in s for s in el] ) ]
    
    要查找索引,可以在打印雄蕊后使用
    A.index(l)
    方法,例如:

    >>> for l in A:
    ...     for i in l:
    ...             if 'wh' in i:
    ...                     print l
    ...                     print A.index(l)
    ...                     break
    ... 
    ['where', 'what', 'when', 'how']
    1
    ['tweet', 'where', 'why', 'how']
    3
    
    但请记住,我不擅长Python。有人能给你更好的方法。(我写的C类代码很差)我想分享这个链接:

    编辑

    感谢@Jaime在enumerate(A)中为k,l推荐我


    您可以使用与对单个列表相同的方法执行此操作,但需要额外的循环:

    for inner_list in A:
        for element in inner_list:
            if # <some condition>
                # <do something>
    
    用于A中的内部\u列表:
    对于内部_列表中的元素:
    如果#
    # 
    

    对于职位,在需要职位的特定循环中添加一个
    枚举
    ,或者简单地为每个内部列表使用类似于
    查找
    的内容也会起到作用。

    对于所有组合的答案:

    mylist = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']]
    for num, sublist in enumerate(mylist):
        if 'why' in sublist:
            print sublist
        for ele in sublist:
            if ele.startswith('wh'):
                print ele, num
    

    a。假设您有一个列表a,您要查找的单词是x

    def howmuch(word)
        lis = []
        for x in A:
            //point A
            if x.count(word) > 0:
            //point A
                lis.append(x)
        return lis
    
    基本上,lis是一个包含所有包含该单词的列表的列表。您可以遍历原始列表。每个元素x都是一个列表。x、 count(word)告诉您该单词在此列表中的次数。0表示它从未出现在列表中。因此,如果它大于0,则它必须在列表中。如果是这样,我们将添加到lis变量中。然后我们把它退回

    b。这和问题a是一样的,除了在a点,在你得到列表后,为每个单词做另一个for循环。对于python,有一个查找字符串的函数,可以查看其中是否存在子字符串(如果确实存在),然后将其附加到列表元素:

    c。对于问题a,在检查计数是否大于0后,这意味着该单词存在于列表中。做一个list.index(word)它会返回索引。对于问题b,一旦找到具有正确子字符串的字符串,请执行list.index(word)


    总而言之,您应该看看python网站,它告诉您许多可以使用的函数。

    我喜欢列表理解和函数编程,下面就是这种方法

    >>> A = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']]
    >>> for i, sublist in enumerate(A):
            if 'why' in sublist:
                print i, sublist
    
    
    3 ['tweet', 'where', 'why', 'how']
    >>> for i, sublist in enumerate(A):
            if any(word.startswith('wh') for word in sublist):
                print i, sublist
    
    
    1 ['where', 'what', 'when', 'how']
    3 ['tweet', 'where', 'why', 'how']
    
    A

    sub_list_a = [ el for el in A if 'why' in el ]
    
    B

    >>> for l in A:
    ...     if 'why' in l:
    ...             print l
    ... 
    ['tweet', 'where', 'why', 'how']
    
    sub_list_b = [ el for el in A if any( ['wh' in s for s in el] ) ]
    
    读起来有点难,但简洁明了

    C

    然后获取每个子列表的索引

    location_a = [ ii for ii, el in enumerate(A) if el in sub_list_a ]
    
    只需替换
    a的
    b
    ,即可获得b部分的位置。

    简单明了

    elem = 'why'
    index_li = []
    for idx, item in enumerate(A):
        for word in item:
            if word.startswith(elem):
                index_li.append(idx)
                break
    print index_li
    
    范例

    >>> elem = 'wh'
    ... index_li = []
    ... for idx, item in enumerate(A):
    ...     for word in item:
    ...         if word.startswith(elem):
    ...             print word, item
    ...             index_li.append(idx)
    ...             break
    ... print index_li
    where ['where', 'what', 'when', 'how']
    where ['tweet', 'where', 'why', 'how']
    [1, 3]
    

    您可以使用以下简单方法:

    >>> key='wh'
    >>> res=[(index, sublist) for index, sublist in enumerate(A) for value in sublist if  value.startswith(key)]
    >>> dict(res)
    {1: ['where', 'what', 'when', 'how'], 3: ['tweet', 'where', 'why', 'how']}
    

    享受吧

    打得好,格里耶什!这很好。我只能将一个问题标记为正确答案,而你的问题可能就是正确答案。让我等待下一个关于2和3的答案(或者如果你可以添加的话)。@khan ok完成复习。但是我不擅长Python,等待像我这样的人给出更好的答案,而不是做
    A.index(l)
    ,在enumerate(A)中,将for循环更改为
    for k,l:
    k
    l
    的索引,而不需要寻找它。@Jaime Rahul已经得到了这个答案。谢谢詹姆:)谢谢,海德罗。这真的很好。我不知道像string.startswith()和string.endswith()这样的东西已经存在了。非常感谢。:-)@khan正是这些函数让我喜欢python的简单性:D@Haidro使用python获取索引的最佳方法是使用
    enumerate
    。检查
    A.index(x)
    将不得不再次在列表中搜索该项,因此不适用于重复项lists@jamylak已更改:)。我已经习惯了
    index()
    Lol:p你的代码没有任何问题,但是你的变量名非常容易混淆
    对于A中的每个x:
    是无效语法:3.谢谢你,很抱歉,对吧,应该是“对于A中的x:”我想,因为它迭代了整个列表,所以它有点像是针对每个x的。我把它和其他东西搞混了。更优雅简洁的B:
    sub_list_B=[el代表A中的el,如果有的话('wh'在s中代表s在el中)]
    。如果必须将
    lambda
    用于it@jamylak是的,我也更喜欢,谢谢!不过,我写的小编辑不起作用,请参见上文。另外,您应该在
    any
    中去掉括号,这样它将成为生成器而不是列表comp。