【问题标题】:Python - remove elements (foreign characters) from listPython - 从列表中删除元素(外来字符)
【发布时间】:2014-12-18 19:15:12
【问题描述】:

我有一个 python 列表,其中包含一些 unicode 值表示的外来字符:

python_list = ['to', 'shrink', u'\u7e2e\u3080', u'\u3061\u3062\u3080', 'chijimu', 'tizimu', 'tidimu', 'to', 'continue', u'\u7d9a\u304f', u'\u3064\u3065\u304f', 'tsuzuku', 'tuzuku', 'tuduku', u'\u30ed\u30fc\u30de\u5b57\uff08\u30ed\u30fc\u30de\u3058\uff09\u3068\u306f\u3001\u4eee\u540d\u6587\u5b57\u3092\u30e9\u30c6\u30f3\u6587\u5b57\u306b\u8ee2\u5199\u3059\u308b\u969b\u306e\u898f\u5247\u5168\u822c\uff08\u30ed\u30fc\u30de\u5b57\u8868\u8a18\u6cd5\uff09\u3001\u307e\u305f\u306f\u30e9\u30c6\u30f3\u6587\u5b57\u3067\u8868\u8a18\u3055\u308c\u305f\u65e5\u672c\u8a9e\uff08\u30ed\u30fc\u30de\u5b57\u3064\u3065\u308a\u306e\u65e5\u672c\u8a9e\uff09\u3092\u8868\u3059\u3002']  

我需要删除所有带有 '\u7e2e' 或其他类似类型的项目。如果列表中的项目甚至包含 1 个 ascii 字母或单词,则不应排除它。例如:'China\u3062' 应包括在内。我参考了这个question 并意识到有些东西与大于 128 的值有关。尝试了不同的方法,比如这个:

new_list = [item for item in python_list if ord(item) < 128]  

但这会返回错误:

TypeError: ord() expected a character, but string of length 2 found

预期输出:

new_list = ['to', 'shrink','chijimu', 'tizimu', 'tidimu', 'to', 'continue','tsuzuku', 'tuzuku', 'tuduku']

我应该如何处理这个??

【问题讨论】:

  • 你需要is_ascii函数,见here
  • TypeError: ord() 需要一个字符,但找到了长度为 2 的字符串

标签: python list python-2.7 unicode ord


【解决方案1】:

您可以这样处理,因为您想保留字符串并删除 unicode,

new_list = [item for item in python_list if isinstance(item, str)]

【讨论】:

    【解决方案2】:

    这是一种方法:

    import string
    python_list = ['to', 'shrink', u'\u7e2e\u3080', u'\u3061\u3062\u3080', 'chijimu', 'tizimu', 'tidimu', 'to', 'continue', u'\u7d9a\u304f', u'\u3064\u3065\u304f', 'tsuzuku', 'tuzuku', 'tuduku', u'\u30ed\u30fc\u30de\u5b57\uff08\u30ed\u30fc\u30de\u3058\uff09\u3068\u306f\u3001\u4eee\u540d\u6587\u5b57\u3092\u30e9\u30c6\u30f3\u6587\u5b57\u306b\u8ee2\u5199\u3059\u308b\u969b\u306e\u898f\u5247\u5168\u822c\uff08\u30ed\u30fc\u30de\u5b57\u8868\u8a18\u6cd5\uff09\u3001\u307e\u305f\u306f\u30e9\u30c6\u30f3\u6587\u5b57\u3067\u8868\u8a18\u3055\u308c\u305f\u65e5\u672c\u8a9e\uff08\u30ed\u30fc\u30de\u5b57\u3064\u3065\u308a\u306e\u65e5\u672c\u8a9e\uff09\u3092\u8868\u3059\u3002']
    filtered = [s for s in python_list if all(c in string.ascii_letters for c in s)]
    print(filtered)
    

    输出:

    ['to', 'shrink', 'chijimu', 'tizimu', 'tidimu', 'to', 'continue', 'tsuzuku', 'tuzuku', 'tuduku']
    

    【讨论】:

    • 这种方法比 salman 的回答要慢一些。您能否举例说明您的答案有效而第一个无效的情况?还是它们完全相似?
    • 您的 ASCII 字符串是字节字符串而您的外来字符串是 Unicode 有点奇怪。起初我没有注意到,但为什么会有混合呢?通常,Unicode 感知程序会将所有文本转换为 Unicode 进行处理。所以这个答案可以在所有字符串都是 Unicode 的情况下起作用,而另一个则不会。
    • 谢谢,这有效..即使在像 u'there' 这样的项目上也能正常工作,而第一个答案会删除所有包含 u 的项目。
    • 但是是否可以只删除那些完全外来的项目?例如,在您的回答中,像 u'China' 这样的列表项由于逗号而被删除。这个可以排除吗??
    • @Swordy 更适合您的情况的解决方案。在这个解决方案中,string.ascii_letters 只不过是一个字符串。您可以根据需要为其添加特殊字符。喜欢string.ascii_letters+','
    【解决方案3】:

    另一种方式:

    new_list=[]
    for word in python_list:
        if word.encode('utf-8').decode('ascii','ignore') !='':
            new_list.append(word)
    

    【讨论】:

      【解决方案4】:

      如果您希望保留所有至少包含一个 ascii 字母的单词,那么下面的代码将执行此操作

      from string import ascii_letters, punctuation
      
      python_list = ['to', 'shrink', u'\u7e2e\u3080', u'\u3061\u3062\u3080', 
                     'chijimu','china,', 'tizimu', 'tidimu', 'to', 'continue', 
                     u'\u7d9a\u304f', u'\u3064\u3065\u304f', 'tsuzuku', 'tuzuku', 'tuduku', u'china\u3061']
      
      allowed = set(ascii_letters)
      
      output = [word for word in python_list if any(letter in allowed for letter in word)]
      print(output)
      # ['to',
      #  'shrink',
      #  'chijimu',
      #  'china,',
      #  'tizimu',
      #  'tidimu',
      #  'to',
      #  'continue'
      #  'tsuzuku',
      #  'tuzuku',
      #  'tuduku',
      #  'china?']
      

      这将遍历每个单词的每个字母,如果allowed 中也包含一个字母,那么它将将该单词添加到您的output 列表中。

      【讨论】:

        猜你喜欢
        • 2022-07-06
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 2015-02-11
        相关资源
        最近更新 更多