【问题标题】:Store output as text, not list将输出存储为文本,而不是列表
【发布时间】:2011-12-30 09:41:32
【问题描述】:

我正在使用这个生成文本:

for i in xrange(100):
    sys.stdout.write(alphabet[bisect.bisect(f_list, random.random()) - 1])

我得到如下所示的输出:

fnhtlr hhub  del tn eleo s d  nerowepeldhoantah yf  tr e saetenwgkoyears 
oenooe urbmhonnrniwc iasseb

我想知道如何将输出存储为 TEXT,而不是列表,以便我可以在其上使用 fd.inc(word)。我基本上是在尝试用我的随机输出来绘制 Zipf 定律。

如果我使用这个:

text1 = [alphabet[bisect.bisect(f_list, random.random())] for i in xrange(300)]

我的输出存储为一个列表,fd 对其不起作用,因为它认为每个字符都是一个单独的单词。

for word in text1:
    fd.inc(word)
print fd
<FreqDist: ' ': 1776, 'e': 1008, 'a': 752, 't': 750, 'n': 604, 'i': 586,
 'o': 556, 'h': 542, 's': 528, 'r': 478, 'l': 388, 'd': 312, 'u': 242, 
'm': 202, 'w': 192, 'g': 172, 'b': 152, 'p': 152, 'f': 150, 'c': 148, 'y': 120,
 'k': 90, 'v': 66, 'q': 12, 'z': 10, 'x': 8, 'j': 4>

我希望将由空格分隔的每个字母序列视为一个单词,即将输出视为文本。

感谢您的帮助!

【问题讨论】:

  • 当你说“文本”时,我相信你的意思是“字符串”:)
  • 什么是fd.inc?就此而言,alphabetf_list 是什么?
  • 对不起,让我更准确地说:字母表是 string.lowercase + ' ',f_list 是我在 Moby Dick 中找到的字母和空格的累积频率。然后我生成一个随机数,它与 f_list 匹配,这反过来又给了我一个“随机”字母。这就是我从白鲸中字母和空格的频率中获取“随机”文本的方式。 f_list = [0, 0.068, 0.083, 0.103 等...]
  • fd=FreqDist() for word in text1: fd.inc(word)

标签: python list text random


【解决方案1】:

试试这个:

text1 = ' '.join([alphabet[bisect.bisect(f_list, random.random())] for i in xrange(300)])

至于添加更多细节:' '.join(list) 是将列表连接到字符串的 Python 方式。 ' '-part 表示它应该与空格连接。例如,如果您用逗号加入它,则改为 ','

或者你甚至可以像这样跳过括号:

text1 = ' '.join(alphabet[bisect.bisect(f_list, random.random())] for i in xrange(300))

也许您想完全加入列表,而字符之间没有任何内容。在这种情况下,解决方案是使用这样的连接:

text1 = ''.join([alphabet[bisect.bisect(f_list, random.random())] for i in xrange(300)])

还有一件事想。如果您将问题中的最后一个示例 sn-p 更改为:

for word in text1.split():
    fd.inc(word)
print fd

这将在加入后再次分裂,但这一次它将在单词而不是字符上分裂(所以也要保持加入)。

最后一句话

既然问题已经解决,我只想解释一下这些东西的含义:

''.join(list) - 这意味着获取由每个字符分隔的原始列表并从中创建一个字符串。

string.split() - 这意味着再次列出它(fd.inc 显然想要一个),但用单词分隔,而不是像原始列表那样使用字符。

另外,我建议您学习一些 Python 基础知识,这将对您将来有所帮助 :) 这是一系列很棒的视频:http://www.youtube.com/watch?v=tKTZoB2Vjuk

【讨论】:

  • 谢谢,但似乎 ' '.join 只是更改了输出,在每个字母之间添加了一个额外的空格。这就是我得到的:p t t n g c d e n s w r o e a s l e r n h e e t a u i h t n r n r b s a o t e t n t t t d a m t p o t e a s i g g a t t n w y s t n r o o t i p e a g g e e c d l b s w u r n t h r t r k t w e p l a a c h o p o r i n i r h b d t t m w h o h a n u t d e n h a p i a n r e k e o i n i s e t a a a l n t t t h s d a
  • 并且频率分布没有改变,它仍然只考虑字母而不是我想要的单词......:&lt;FreqDist: ' ': 714, 't': 60, 'a': 50, 'e': 48, 'n': 46, 'r': 34, 'i': 32, 'o': 30, 'h': 28, 's': 24, 'g': 18, 'd': 16, 'p': 16, 'w': 14, 'b': 12, 'l': 12, 'u': 10, 'c': 8, 'f': 6, 'k': 6, 'm': 6, 'v': 6, 'y': 2&gt; 现在空间的频率要高得多。
  • 在上面添加了一个新示例。但是如果列表不包含任何空白元素,那么完全只有一个词吗?无论如何,请查看我的第三个示例,看看它是否符合您的要求。
  • 是的,''.join 是我需要的输出。但我仍然卡住了:如果我的输出看起来像这样:doshe eiotboq stt u r cblnstbaeroeleebptn tarde pgb t tnonc sieherhriieee n teuethhwma bd i ut 比 fd['stt'] 返回 0,当我希望它接收 'set' 是一个出现一次的 word在文本中。我希望我很清楚......我似乎无法找到如何解决这个问题的解决方案:/
  • @Julia:有many newline symbols '\n' in the Moby Dick 因此应该使用text.split() 而不是text.split(' ') 来获取单词。
猜你喜欢
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多