我正在导入CSV文件并搜索每个元素以匹配正则表达式。如果为true,我想删除该元素。但我希望通过索引删除元素,而不是通过值删除元素,尤其是因为通过索引删除更快。
with open(file, "r", newline="") as fh:
data = csv.reader(fh)
s_data = sorted(data, key=operator.itemgetter(0))
regex = re.compile("\D")
# Search for any non-numeric characters in each index and discard the element, if found.
for element in s_data:
if regex.search(element[0]) is not None:
pop(element) # <-- this is the problem
如何按索引删除匹配元素?
答案 0 :(得分:2)
s_data.pop(s_data.index(element))
如果s_data
中的每个元素都是唯一的,将起作用。如果没有,你可以做
for index, element in enumerate(s_data):
if regex.search(element[0]) is not None:
s_data.pop(index)
答案 1 :(得分:2)
s_data = [e for e in s_data if regex.search(e[0]) is None]
在效率方面更好。
从您的代码中,我可以告诉您希望保留符合此标准的元素:
regex.search(e[0]) is None
如果您逐个删除元素,因为从列表中删除O(n)
,如果您多次删除,则对于大数据来说真的不会很快。
我提供的那个叫做列表理解。它是一种生成列表的python方式。它会创建一个新列表,而不是从原始列表中删除元素。列表理解更有可能以c级效率进行优化和执行。
功能风格的类似方式,但速度要慢一些:
s_data = filter(lambda e: regex.search(e[0]) is None, s_data)