【问题标题】:How can I generate random numbers based on a pattern from a given list of numbers?如何根据给定数字列表中的模式生成随机数?
【发布时间】:2015-02-27 22:22:55
【问题描述】:

我正在尝试根据我将提供的列表生成 x 个随机数(包含我想要生成的相同数量的数字)。 到目前为止,我有这个代码:

import random
list = []

while len(list) < 10:
    x = random.randint(1, 100)
    if x not in list:
        list.append(x)

list.sort()
print (list)

问题是,我如何输入我拥有的列表,以便 Python 可以读取一些模式(缺少更好的词)并生成数字? 尝试谷歌它,到目前为止没有发现任何东西。 谢谢。

【问题讨论】:

  • 输入列表究竟是如何影响随机数生成的?您只是在寻找random.shufflerandom.sample
  • 你试过正则表达式吗?正则表达式真的可以帮助你解决模式
  • 您需要更清楚地描述您的问题。列表将如何影响列表中的数字?你想让你的代码识别模式吗?
  • 如上所述,这个列表应该如何影响输出?此外,“输入列表”是什么意思?请给出输入列表的示例(包括您当前使用的格式 - python 列表、文本文件、csv 等),以及潜在输出的示例。

标签: python random numbers


【解决方案1】:

使用 python 可以读取文件并将其拆分为使用 str.split() 的列表,无需像这样的参数:

lines = [] 
for line in open('filename'):
    line = line.strip().split() # splits on whitespace
        for token in line:
            lines.append(token)

如果文件有不同的分隔符,例如冒号,如果分隔符是字符或固定的字符序列,则可以像上面那样使用 split('char') 分割它,如 split(':') 或 split(' charseq') 与 split('===') 一样,或者可以使用 re.split('some_regex','text2split') 在正则表达式上进行拆分。此外,验证数字数据的格式以确保无效数据不会在后续处理中导致错误或其他不良行为可能很有用。

下面是从文件中提取逗号分隔的数字并将它们附加到列表中的完整示例,其中数字被过滤以匹配正则表达式定义的三种形式中的至少一种: (1) '\d+' (多于一位小数); (2) '\d+.\d*'(多于一个十进制数字后跟一个句点,后跟零个或多个十进制数字;或 (3) '\d*.\d+'(零个或多个十进制数字后跟一个句点后跟一个或多个十进制数字)。在此示例中,编译了用于匹配这些形式的数字的正则表达式以提高性能。

import re
numList = []
regex = re.compile('^(\d+)|(\d+\.\d*)|(\d*\.\d+)$')
for data in open('filename'):
    tmpList = re.split(',',data.strip()) # could use data.strip().split(',')
    for element in tmpList:                   
    if regex.match(element):
        numList.append(element)

运行后,numList 中的数字可以像这样迭代:

for item in numList:
    print(item)
    # do other things such as calculations with item     

【讨论】:

  • 我认为你必须在字符串文字前加上一个 'r' 或转义反斜杠。此外,str.split 不适用于正则表达式。但是re 模块中有一个拆分功能。
  • 感谢您的信息。如果根据docs.python.org/2/library/re.html?highlight=re.split#re.split 正则表达式是单引号,则不需要在 re.split() 前面加上“r”。我正在使用 Python 2 与 Apache Spark 兼容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2013-01-02
  • 2021-01-16
相关资源
最近更新 更多