【问题标题】:Scrambling of letters within a text file文本文件中的字母加扰
【发布时间】:2015-06-21 19:19:59
【问题描述】:

我正在准备一个测试数据,它必须有不同的字母说 அ-20 次 ம-30 次,த-40 次 .....(它们是支持 UTF-8 编码的泰米尔语字母) 这可以使用 print 语句来实现

{print ( ' ம் ' * 30 ) + ( ' த ' * 40  ) + }

但是,我需要打乱它们,这样它们就不会以任何特定的顺序出现。我有大约 230 多个字母,我将打印 20,30,40 次。然后我需要打乱它们并将它们写入输出文件。 这方面的任何帮助都会有所帮助。

【问题讨论】:

    标签: python string scramble


    【解决方案1】:

    我建议把这个问题分成 3 个部分:组装你的字母列表,打乱列表,然后将其写入文件。请注意,以下代码中的第一行应位于 python 文件的顶部,以允许您在源代码本身中使用 utf-8 字符。

    # -*- coding: utf-8 -*-
    
    import codecs  # To write UTF-8 characters to a file
    import random
    
    # Assemble data list    
    letters = [u'அ', u'ம', u'த']
    data = []  # This list will hold the shuffled data
    
    for current_letter in letters:
        # Choose how many times to repeat the current letter.
        times_repeated = random.choice([20, 30, 40])
        data.extend([current_letter] * times_repeated)
    
    # Now, shuffle the 'data' list
    random.shuffle(data)
    
    # Now write the shuffled list to a file as one continuous string
    data_string = "".join(data)
    
    with codecs.open("data.txt", "w", "utf-8") as f:
        f.write(data_string)
    

    请注意,如果您知道希望每个字母出现多少次,您可以将该信息放入字典中,而不是从[20, 30, 40] 中随机选择:

    # The key is the letter to repeat, the value is the number of times to repeat it
    letters = {u'அ': 20,
               u'ம': 30,
               u'த': 20}
    
    for letter in letters:
        times_repeated = letters[letter]
        # ... rest of the code would look the same ...
    

    【讨论】:

    • 在您的for 循环中,最好使用letters.get(letter, 0)
    • @zachgates7 使用此代码时,出现错误:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)
    • @sibikanagaraj 我已更新答案以在源代码本身中支持 utf-8 字符,这应该可以解决您的问题。具体来说,我在顶部添加了一个编码行,并更改了letters 列表的声明。
    【解决方案2】:

    感谢我的朋友 @AswinMurugesh 帮助我编写代码。

    下面的代码成功了。

    import codecs
    import tamil
    from random import shuffle
    
    inp_file = codecs.open("/home/sibi/Desktop/scramble.txt",encoding="utf-8")
    inp_text = inp_file.read().rstrip()
    
    tamil_letters = tamil.utf8.get_letters(inp_text)
    shuffle(tamil_letters)
    tamil_letters = "".join(tamil_letters).encode("utf-8")
    print tamil_letters
    
    out_file = open('outputscrambled.txt','w')
    out_file.write(tamil_letters)
    

    【讨论】:

      【解决方案3】:

      有很多方法可以解决这个问题。最有效的是使用random module

      random.shuffle

      >>> from random import shuffle
      >>> my_string = list('This is a test string.')
      >>> shuffle(my_string)
      >>> scrambled = ''.join(my_string)
      >>> print(scrambled)
      .sTtha te s rtisns gii
      

      为此,您必须从字符串的字符创建一个list,因为字符串是immutable

      如果必须存储不同的值,则必须创建一个新对象。

      random.sample

      >>> from random import sample
      >>> my_string = 'This is a test string.'
      >>> scrambled = random.sample(my_string, len(my_string))
      >>> scrambled = ''.join(scrambled)
      >>> print(scrambled)
      gr.s i tisstheit Tn sa
      

      您不必为此创建list;因为,来自random.sample 文档:

      返回一个包含种群元素的新列表,同时保持原始种群不变。

      The sorted built-inrandom.random

      >>> from random import random
      >>> my_string = 'This is a test string.'
      >>> scrambled = sorted(my_string, key=lambda i: random())
      >>> scrambled = ''.join(scrambled)
      >>> print(scrambled)
      ngi rts ithsT.staie s 
      

      您也不需要list。来自sorted 文档:

      从可迭代的项目中返回一个新的排序列表。

      因为字符串在 Python 中被视为iterable(见下文),所以可以在其上使用sorted

      一个可迭代的定义为

      一个能够一次返回一个成员的对象。

      【讨论】:

      • 我试过 random , shuffle 。虽然它是英文字母的好选择,但它对泰米尔语.Eg 的作用不同。假设 கா 存在于原始文本中,它表示为 2 个字符,因此 shuffle 会与它混淆并开始打印垃圾如果它随机播放。解决问题
      • 我会推荐第三个建议。排序的内置函数。 @sibikanagaraj
      • 第三个建议是我正在使用的# coding=utf-8 from random import random my_string = 'அ ஆ ந் ' scrambled = sorted(my_string, key=lambda i: random()) scrambled = ''.join(scrambled) print(scrambled) 但输出又是垃圾字符
      • 你能举一个这些所谓的垃圾字符的例子吗? @sibikanagaraj
      • 首先我在没有 # -- coding: utf-8 -- 的情况下运行它。它给出了错误: SyntaxError: Non-ASCII character '\xe0' in file stack.py on line 2, but no encoding declaration;详情见python.org/peps/pep-0263.html 接下来,我添加 unicode 8 现在输出是 ������ ��
      【解决方案4】:

      只需使用random.choice:

      import random
      size = 1000
      values = [' ம் ', ' த ', ' த ']
      print "".join(random.choice(values) for i in xrange(size))
      

      【讨论】:

        猜你喜欢
        • 2017-03-22
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 2013-01-12
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 2013-06-27
        相关资源
        最近更新 更多