Python - remove elements (foreign characters) from list
我有一个用一些Unicode值表示的外来字符的python列表:
1 | 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字母或单词,则不应排除在外。例如:应包括
1 | new_list = [item for item in python_list if ord(item) < 128] |
但这会返回一个错误:
1 | TypeError: ord() expected a character, but string of length 2 found |
预期输出:
1 | new_list = ['to', 'shrink','chijimu', 'tizimu', 'tidimu', 'to', 'continue','tsuzuku', 'tuzuku', 'tuduku'] |
我该怎么做呢??
如果您希望保留其中至少包含一个ASCII字母的所有单词,则下面的代码将执行此操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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?'] |
这将迭代每个单词的每个字母,如果一个字母也包含在
你可以这样处理,因为你想保留字符串并删除unicodes,
1 | new_list = [item for item in python_list if isinstance(item, str)] |
另一种方式:
1 2 3 4 | new_list=[] for word in python_list: if word.encode('utf-8').decode('ascii','ignore') !='': new_list.append(word) |
这里有一种方法:
1 2 3 4 | 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) |
输出:
1 | ['to', 'shrink', 'chijimu', 'tizimu', 'tidimu', 'to', 'continue', 'tsuzuku', 'tuzuku', 'tuduku'] |