微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何匹配for循环中以某个字母序列开头的所有单词? 蟒蛇

如何解决如何匹配for循环中以某个字母序列开头的所有单词? 蟒蛇

我有一本字典,里面有一些人格特质和相关的形容词:

personality={'sincerity': [ "tru","honest"],'excitement': ['excit','fizzy']} 

(请注意,这要长得多)

我还有一本字典,其中包含从推文中提取的单词列表:

prova={"brand1": ["true","truth","thrutfull","orange","friend","meaning"],"brand2": ["truth","exiting","excited","lama","lambo","blade"]} 

我想将个性词典中的一个字符串与所有包含该prova词典中该字符的字符串进行匹配:个性[sincerity]中的字符串“ tru”应与prova中的“ true”,“ truth”,“ truthful”匹配[brand1]和prova [brand2]中的“真相”。

由于我有很多品牌,所以我想通过for循环来实现。有什么建议吗?

解决方法

您可以使用如下所示的for循环:

personality={'sincerity': [ "tru","honest"],'excitement': ['excit','fizzy']} 

prova={"brand1": ["true","truth","truthfull","orange","friend","meaning"],"brand2": ["truth","exiting","excited","lama","lambo","blade"]} 

d = []
for x in personality.values():
  for y in prova.values():
    for z in y:
      for n in x:
        if n in z: 
          d.append(z)
print(d)

但是要为列表理解加油三!!

d = [z for x in personality.values() for y in prova.values() for z in y for n in x if n in z]
print(d)
,

如果您要实现的目标是对@Wasif Hasan答案的评论中所描述的内容,而与您对问题的描述有所不同,则可以尝试:

>>> from collections import defaultdict
>>> import re
>>>
>>> personality = {
...     "sincerity": ["tru",...     "excitement": ["excit","fizzy"]}
>>> prova = {
...     "brand1": ["true","thrutfull",...     "brand2": ["truth","blade"]}
>>>
>>> patterns = {k:re.compile(f"\s?({'|'.join(v)})") for k,v in personality.items()}
>>> results = defaultdict(dict)
>>>
>>> for k1,v1 in prova.items():
...     for k2,v2 in patterns.items():
...         results[k1][k2] = len(v2.findall(' '.join(v1)))
... 
>>> results
defaultdict(<class 'dict'>,{'brand1': {'sincerity': 2,'excitement': 0},'brand2': {'sincerity': 1,'excitement': 1}})
>>> results['brand1']
{'sincerity': 2,'excitement': 0}

上面的代码首先创建一个dict正则表达式对象(请参见patterns = ...)。 dict具有与personality相同的键,并且值是与personality中的值所生成的模式相对应的对象。例如,sincerity的模式为"\s?(tru|honest)"。构造了模式,以便以后可以在没有空格或一个空格的情况下搜索truhonest。我使用模式来搜索prova中每个品牌的值中的匹配项。为了计算发生次数,我从这些值构造了一个字符串(例如,对于brand1 ["true","meaning"]变成"true truth thrutfull orange friend meaning"),并使用len(findall)查找匹配项的数量。

注意:

  1. 我假设与list中的每个品牌关联的prova没有重复项(或者,如果它们具有重复项,您有兴趣对多次出现的单词计数)。如果不是这种情况,则需要使用' '.join(v1)更新set()以消除重复。
  2. 我还假设personality中的字符串是您期望prova中的单词开始的方式。相反,如果您正在各处寻找匹配项,则需要通过删除re.compile...来更新\s?
  3. 在您的描述中,您有错字,即“ thrutfull”。因此,即使您期望个性[sincerity]中的“ tru”与prova [brand1] 中的“ true”,“ truth”,“ truthful”匹配,您在上面看到的情况仍然是2匹配(而不是3个)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?