【问题标题】:operating with string, list & dictionaries使用字符串、列表和字典进行操作
【发布时间】:2014-10-13 05:19:05
【问题描述】:

我有一个列表和一本字典。

l = ['one', 'two', 'three', 'four']
d = {'aw.one' : '#aw.one', 'aw.two' : '#aw.two'}

现在,我有一个字符串:

s = "this is one sentence"

我想检查列表 l 中的任何项目是否存在于字符串中。如果是,那么我想从字典中获取值,其键包含列表中的该项目。

例如,在给定的示例中
- 字符串中的“一个”出现在列表 l 中 - 然后我需要打印#aw.one。

如果我的字符串是:

s = "this is two balls"

应该打印出来

#aw.two.

我该怎么做?

【问题讨论】:

标签: python string list dictionary


【解决方案1】:

直接的方法是迭代列表并检查单词是否在s 中,然后迭代字典键以检查其中是否有任何单词,如下所示

for item in l:
    if item in s:
        for key in d:
            if item in key:
                print d[key]

我们甚至可以这样写,而不是在多行中写相同的内容

print ", ".join(", ".join(d[k] for k in d if i in k) for i in l if i in s)

【讨论】:

    【解决方案2】:

    也许最好的方法是构建一个字典,其中键是值部分,因此要查找它是否存在只需花费 O(1)

    >>> import re
    >>> l = ['one', 'two', 'three', 'four']
    >>> d = {'aw.one' : '#aw.one', 'aw.two' : '#aw.two'}
    >>> s = "this is two balls"
    >>> d_reversed = {
    ...     v_part:k
    ...     for k,v in d.iteritems()
    ...     for v_part in re.findall(r"[\w']+", v) #for all words from every value
    ...     
    ... }
    >>> for w in s.split():
    ...     if w in d_reversed:
    ...         print d_reversed[w], d[d_reversed[w]] #print the key from the main dict, and its value
    ...         break
    ... 
    aw.two #aw.two
    

    【讨论】:

      【解决方案3】:

      您可以使用一对列表推导和一个过滤器 lambda 来实现相同的目标:

      matching_words = [ word for word in l if word in s ]
      matching_values = [ value for key, value in d.items() if list(filter(lambda x: x in key, matching_words)) ]
      for value in matching_values:
          print(value)
      

      【讨论】:

        【解决方案4】:

        如果您的密钥前缀始终相同:

        >>> l = ['one', 'two', 'three', 'four']
        >>> d = {'aw.one' : '#aw.one', 'aw.two' : '#aw.two'}
        >>> s = "this is one sentence"
        >>> print(''.join(d.get('aw.{}'.format(w)) for w in l if w in s))
        #aw.one
        

        【讨论】:

          【解决方案5】:

          使用集合和字典:

          print [d['aw.'+i] for i in (set(s.split()) & set(l)) if 'aw.'+i in d]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-23
            • 1970-01-01
            • 1970-01-01
            • 2021-06-27
            • 1970-01-01
            相关资源
            最近更新 更多