Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从大型字符串列表创建新的字符串列表_Python_Arrays_String_List_Match - Fatal编程技术网

Python 从大型字符串列表创建新的字符串列表

Python 从大型字符串列表创建新的字符串列表,python,arrays,string,list,match,Python,Arrays,String,List,Match,假设我有一个字符串数组,它采用YYYYMMDD格式的日期格式。例如: masterlist = ['20190701', '20190702', ... '20190731'] z = ['20190701'] x = ['20190702', ... , '20190721'] y = ['20190722', ... , '20190731'] 假设我想创建一个新的3个列表系列,长度分别为x、y和z。对于这个例子,我们可以简单地说x=20,y=10,和z=1。格式是这样的,我想循环通

假设我有一个字符串数组,它采用YYYYMMDD格式的日期格式。例如:

 masterlist = ['20190701', '20190702', ... '20190731'] 
z = ['20190701']
x = ['20190702', ... , '20190721']
y = ['20190722', ... , '20190731']
假设我想创建一个新的3个列表系列,长度分别为
x
y
z
。对于这个例子,我们可以简单地说
x=20
y=10
,和
z=1
。格式是这样的,我想循环通过
masterlist
中的所有元素来设置为
z
。从这里开始,我想随机选取20个不包含z中日期的日期,并将其分配给
x
。最后,那些不在
x
z
中的日期将留给
y
。换句话说,任何列表都不应该有相同的日期

例如:

 masterlist = ['20190701', '20190702', ... '20190731'] 
z = ['20190701']
x = ['20190702', ... , '20190721']
y = ['20190722', ... , '20190731']
还有一个:

z = ['20190702']
x = ['20190701', '20190703', ..., '20190720']
y = ['20190722', ... , '20190731']
只要列表是互斥的,并且整体上是详尽的,那么
x
和/或
y
之间的顺序或随机混合并不重要


实现这一点最简单的方法是什么?

您可以随机洗牌列表,然后对其进行切片(替换所需的长度):


您可以使用集合(比如我的z=1、x=2、y=1和masterlist=5)来实现这一点


这是查找集合之间的差异(它将返回第一个集合中不在第二个集合中的值),最后的数字是样本大小。

您可以通过创建一个“规则”字典来实现这一点,您要设置主列表的划分,通过这种方式,您可以在划分主列表的过程中获得活力和控制力:

随机导入
将pprint导入为pp
主列表=范围(0,31,1)#这是您从2019.07.01到2019.07.31的日期列表
divided={#还设置了用于应用划分主列表的规则
1 : 20,
2 : 10,
3 : 1
}
采取=[]
对于k,v,在divided.items()中:
除以[k]=random.sample([master_列表中元素的元素,如果元素未被提取],v)
对于除以[k]的t:take.append(t)
pp.pprint(分割)
输出:

{1:[26,25,8,22,17,19,13,7,14,0,27,18,30,5,2,6,20,1,11,9],
2: [15, 21, 23, 28, 4, 16, 10, 24, 3, 12],
3: [29]
}

您只需将另一个key:value添加到分割字典中,即可设置另一个“分隔符”。

您只需将主列表洗牌,然后将元素放入列表中,同时确保它们不在其他元素中

我制作了一个函数,该函数在检查元素是否不在某个
集中时生成一个特定长度的列表。我还假设,在这三个列表中,可以有重复项,但列表之间不能有重复项

def makeListWithConstraint(主列表,newlength,constraintSet=set()):
i=0
l=[]
while(len(l)
然后,您将使用以下函数作为示例:

 masterlist = ['20190701', '20190702', ... '20190731'] 
z = ['20190701']
x = ['20190702', ... , '20190721']
y = ['20190722', ... , '20190731']
#先洗牌以确保随机
随机。洗牌(主列表)
#制作受约束的列表
z_list=makeListWithConstraint(主列表,x)
x_list=makeListWithConstraint(主列表,x,集合(z_列表))
y_列表=带约束的makeListWithConstraint(主列表,y,集合(z_列表+x_列表))

听起来您可能需要我看到的,而
random.sample()
是我的自定义函数的一个很好的选择。因此,如果我想将Z硬编码到主列表中的第一个值(例如,Z=主列表[0]),并继续执行其余代码,它将包含在x中。为什么会这样?因为主列表[0]是字符串,而不是列表。在字符串上调用
set
时,它实际上会将集合分解为字符串中的单个字符,因此集合类似于
{0',9',7',2',1'}
。最好的故障排除方法之一是
print
函数:P。我总是在编写一段代码后进行打印,以确保得到我应该得到的结果。随机。sample(masterlist,1)实际上仍然返回长度为1的列表。