从现有列表创建重复元素列表

Create a list of duplicate elements from an existing list

我正在参加 class 学习摩尔斯电码。在 class 的开头,我们得到了一个 .txt 格式的单词列表。我获取此列表并将其转换为摩尔斯电码 .mp3 文件。 (LCWO.net)每个单词都弹一次,不过还是弹多遍比较好,这样我就可以学习节奏了。

我的目标是获取原始文本文件并根据用户输入将每个单词复制多次。我一直在手动输入这个,但我认为计算机可以更容易地完成它。所以,我选择 Python 来尝试创建程序。到目前为止,我已经弄清楚如何打开 .txt 文件、创建列表、去除每个单词后的换行符,然后将列表打印到屏幕上。

如何遍历此列表并根据用户输入创建每个单词的副本?例如,用户会为每个单词的 3 个副本输入“3”。为了说明,如果单词列表是 ['cat', 'dog', 'chicken'] ,我如何创建一个列表:['cat', 'cat', 'cat', 'dog', 'dog', 'dog', 'chicken','chicken', 'chicken'],然后将此列表写入文本文件,以便每个单词都在一行上?

文件名是 'words.txt'

cat cat cat
dog dog dog
chicken chicken chicken

我想我可以弄清楚如何获取用户输入并将其分配给一个变量,然后将此变量用作生成新列表的循环的一部分。我还认为我可以弄清楚如何将新列表写入文件。我需要帮助的部分是弄清楚如何根据用户的输入(单词的迭代次数)创建列表。

我知道我要求你完成这项工作,但我已经通读了 Python 文档,但我正在努力寻找解决方案。

感谢您的帮助!

斯科特

您不需要任何库(甚至是标准的 itertools)。只需将您的列表乘以整数即可。

In[11]: x = ["cat", "dog", "chicken"]
In[12]: x * 3
Out[12]: ['cat', 'dog', 'chicken', 'cat', 'dog', 'chicken', 'cat', 'dog', 'chicken']
In[13]: sorted(x * 3)
Out[13]: ['cat', 'cat', 'cat', 'chicken', 'chicken', 'chicken', 'dog', 'dog', 'dog']  

假设您有 l = ['cat', 'dog'] 并且您希望每个元素重复 3 次,您可以使用 itertools 库来执行以下操作

import itertools

l = ['cat', 'dog']
duplicate = list(itertools.chain.from_iterable(itertools.repeat(x, 3) for x in l))

这样你就可以保持元素的顺序

一个简单的方法是在你的循环中放置另一个循环;

with open('words.txt') as f:
  for line in f.readlines():
    for x in range(3):
      print(word_to_morse(line))

鉴于:

>>> li
['cat', 'dog', 'chicken']

你可以这样做:

>>> [e for s in li for e in [s,s,s]]
['cat', 'cat', 'cat', 'dog', 'dog', 'dog', 'chicken', 'chicken', 'chicken']

或者,由于字符串是固定的且不可变的,如果您也这样做,您将不会感到惊讶:

>>> [e for s in li for e in [s]*3]
['cat', 'cat', 'cat', 'dog', 'dog', 'dog', 'chicken', 'chicken', 'chicken']

这是对 Alex Martelli 的 answer 关于如何展平列表列表的修改。在这种情况下,[s, s, s] 或您的字符串 3 次。

如果您正在读取文件,您可以这样做:

n=3
with open(ur_file) as f_in:
    flat_list=[word for line in f for word in line.split()]
    duped_words=[mult for word in flat_list for mult in [s]*n]

这个脚本应该可以解决问题:

count = int(input('Input you number: '))
with open('text.txt','r') as f:
    l = [word for word in f.read().split('\n')]
with open('text2.txt','w') as f:
    for n in range(count):
        f.write(' '.join(l))
        f.write('\n')