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。