Python 问题:append()方法不能保持文本文件中字符串的原始顺序
我有一个函数Python 问题:append()方法不能保持文本文件中字符串的原始顺序,python,python-3.x,list,sorting,Python,Python 3.x,List,Sorting,我有一个函数create\u亵渎\u output()(整个代码见下文),其中来自转录本文件的每一个亵渎都被附加到一个列表中,后跟时间戳和审查字符。我想保持转录本中元素出现的顺序 但我的问题是附加元素的顺序与转录本中的顺序不同。我认为append()将始终在列表的末尾添加一个元素(与原始顺序相对应)。尽管我没有使用sorted()函数,但亵渎似乎是按字母顺序排序的 更准确地说,当前(不需要的)输出如下所示: # Current output in wrong order. [['fart', '
create\u亵渎\u output()
(整个代码见下文),其中来自转录本文件的每一个亵渎都被附加到一个列表中,后跟时间戳和审查字符。我想保持转录本中元素出现的顺序
但我的问题是附加元素的顺序与转录本中的顺序不同。我认为append()
将始终在列表的末尾添加一个元素(与原始顺序相对应)。尽管我没有使用sorted()
函数,但亵渎似乎是按字母顺序排序的
更准确地说,当前(不需要的)输出如下所示:
# Current output in wrong order.
[['fart', '00:00:03,950', '00:00:06,840', '****'],
['damn', '00:00:03,950', '00:00:06,840', '****'],
['damn', '00:00:03,950', '00:00:06,840', '****'],
['erotic', '00:00:03,950', '00:00:06,840', '****'],
但是元素在文件中的外观是1)屁,2)色情,3)该死,4)该死,因此期望的输出是:
# Target output in correct order.
[['fart', '00:00:03,950', '00:00:06,840', '****'],
['erotic', '00:00:03,950', '00:00:06,840', '****'],
['damn', '00:00:03,950', '00:00:06,840', '****'],
['damn', '00:00:03,950', '00:00:06,840', '****'],
当成绩单中有更多的亵渎时,这个问题也会发生。一旦它们具有相同的时间戳,它们就会按字母顺序排序,而不是保持原来的顺序。我尝试过对列表进行如下排序:
sorted\u output=sorted(亵渎\u output,reversed=True)
sorted\u output=sorted(亵渎输出,反转=False)
sorted\u output=sorted(亵渎输出,key=lambda x:x[0])
诸如此类,但没有达到我的目标
我知道这是一个微不足道的问题。但亵渎的顺序不能按字母顺序排列。有人知道为什么append()
会这样做,以及我如何解决这个问题吗
整个代码:
def create_profanity_output():
"""Create a list 'profanity_output' which shall contain each profanity,
its timestamp and the default censor characters ('****')."""
profanity_output = []
# Define censor characters that occur in the transcript.
censor_chars = "****"
# Create lists with transcript data.
line_numbers = []
timestamps = []
text_lines = []
# Get lines from the transcript that contain strings according to the
# following pattern: 'line number', 'timestamp', 'text line', '' (empty
# string).
lines = transcript.splitlines()
# Iterate over 'lines' to get each single element from it. Divide the
# range object by 4 because of the 'lines' object's structure: (0: line
# number, 1: timestamp, 2: text line, 3: empty string).
for x in range(int(len(lines) / 4)):
# Increment iterable by 4. The * sign allows to always move 4
# elements further to the next "profanity cycle".
x = x * 4
# Add relevant elements to lists.
line_numbers.append(lines[x])
timestamps.append(lines[x + 1])
text_lines.append(lines[x + 2])
# Iterate over transcript data and create a zip object.
for line_number, timestamp, text_line in zip(line_numbers, timestamps,
text_lines):
# Create a list with timestamp strings: '00:00:03,950', '-->',
# '00:00:06,840'.
time_splits = timestamp.split()
for swearword in wordlist.splitlines():
# Iterate over tokenized text lines.
for word in text_line.split():
if word == swearword:
profanity_output.append([word, f"{time_splits[0]}",
f"{time_splits[2]}",
censor_chars])
return profanity_output
# Call function.
profanity_output = create_profanity_output()
print(profanity_output)
您对同一行的输出实际上是按照
wordlist
中亵渎的顺序排列的。因此,你首先选择一个亵渎,然后通过这条线,看看它是否存在。实际上,您需要首先迭代该行。您还可以使用列表功能查看您的单词是否为脏话
像这样:
swearwords=wordlist.splitlines()
#迭代标记化文本行。
对于文本中的word_line.split():
如果单词是脏话:
亵渎输出.append([word,f”{time\u splits[0]}),
f“{time_splits[2]}”,
审查员(查员)
正如Michael Butscher在评论中提到的,您的问题是循环的顺序错误。目前,您的脏话列表的顺序决定了相同文本行中的单词的添加顺序。切换循环的顺序将为您提供正确的顺序
然而,更好的解决办法是事先解析你的脏话。这仍将保持单词在文本行中的顺序,但也将加快查找速度(这是更好的做法,即使您不需要速度)
swearwords=set(wordlist.splitlines())
对于文本中的word_line.split():
如果单词是脏话:
...
我们可以查看您的输入吗?不过您肯定应该改变查找脏话的方式。最好将wordlist
作为set
解析一次,然后查看swearword\u set
中的word是否为。只需切换swearword…
的嵌套for循环和word…
的嵌套for循环即可。外部循环控制着顺序。@MichaelButscher:Yey,现在它工作了!非常感谢你!感谢您的回答和解释,以及关于解析脏话的附加提示。我将在代码中对此进行调整。