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,现在它工作了!非常感谢你!感谢您的回答和解释,以及关于解析脏话的附加提示。我将在代码中对此进行调整。