从现有列表创建重复元素列表
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')
我正在参加 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')