【问题标题】:Python - If Value in List (or similair)Python - 如果列表中的值(或类似)
【发布时间】:2014-06-02 20:35:00
【问题描述】:

我需要在 Python 中使用或创建一个比较函数,也许它已经存在这样做的方法?

我需要将一个字符串与列表中的一个值进行比较,即使它有几个字符,我也需要进行匹配。我会举个例子让你明白我的意思。

示例 1:

列表中的值:Name: This is the title

搜索值:Name This is the title

示例 2:

列表中的值:Name and shortening m.m.

搜索值:Name and shortening m.m

如您所见,我要比较和需要匹配的值非常相似。搜索中的值是文件夹名称,因此它们有些不同,因为它们包含非法字符。

也许最简单的方法是在比较 \/:*?"<>| 和任何尾随点之前从字符串中删除不允许的字符。

关于比较字符串并获得匹配的最有效方法是什么?

编辑:这是一种丑陋的做法吗?

def Cleanup(Str):
    Illegal = ['\\','/',':','*','?','"','<','>','|']
    return ''.join([char for char in Str if char not in Illegal]).rstrip('.')

【问题讨论】:

标签: python list compare


【解决方案1】:

我确信有更好的方法来做到这一点,但这是我的绝招

import string
a = "Name: This is the title"
b = "Name This is the title"

# remove punctuation and make all lower-case
def strippedAndLowered(myString):
    return "".join(i for i in myString if i not in string.punctuation).lower()

strippedAndLowered(a) == strippedAndLowered(b)  # returns True

【讨论】:

    【解决方案2】:

    使用以下代码去除标点符号,然后进行比较:

    def search(lst, item):
        for i in lst:
                i = ''.join([char for char in i if char.isalpha() or char == ' '])
                if item == i:
                        return True
        return False
    

    【讨论】:

    • 那你到底在追求什么?
    • 抱歉,我删除了我的评论,因为我认为我误读了您的代码。我不想去掉所有标点符号,我编辑了我的原始帖子,至少有一种方法可以把事情弄清楚。感谢发帖
    【解决方案3】:

    translate 函数应该更快:

    item = "Name: This is the title"
    search = "Name This is the title"
    illegal = r'\/:*?"<>|'
    
    def compare(s1, s2):
        return s1.translate(None, illegal) == s2.translate(None, illegal)
    
    print compare(search, item)
    

    给予:

     True
    

    如果你真的很担心性能,并且有很多比较,你可以将翻译的版本缓存在字典中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2018-10-24
      • 2010-10-01
      相关资源
      最近更新 更多