尝试形成一个列表,该列表的大小取自另一个列表中元素的数量,并将第一个列表的元素追加到新列表中

时间:2018-09-23 22:58:14

标签: python

for n in range(1,(len(randnum))/3):
    X.append(randnum(n))

for i in range((len(randnum))/3 , (2/3)*len(randnum)):
    Y.append(randnum(i))

for r in range ((2/3)*len(randnum) , len(randnum)):
    Z.append(randnum(r))    

我一直试图根据此标准形成一个列表,并且我在下面的此行中不断收到此错误消息:

for n in range(1,(len(randnum))/3):

TypeError:“ float”对象无法解释为整数

导致该问题的程序部分是上面的那部分,如果我可以解决的话,我可以改掉错误并将其应用于其余部分。

这是一个示例列表,用于填充其他三个具有20个元素的列表,我希望我形成的每个列表都从该列表中提取大约1/3的不同位置的元素:

[ 59.18013391 12159.7881626  26308.21887981  8357.05103068
 20718.85232457 16333.1546026   9828.75690047 10273.65018539
  5949.58907673  8767.68292925 31826.29595355 13749.12915211
 25423.61181129 28799.50849876  9517.54482827 27275.19296144
 12460.2541769  25883.7888204  10393.9452616  26008.572598  ]

我希望这段代码形成3个包含例如的新列表

X = [59.18013391 12159.7881626  26308.21887981  8357.05103068
 20718.85232457 16333.1546026]

Y = [9828.75690047 10273.65018539
  5949.58907673  8767.68292925 31826.29595355 13749.12915211 ]

Z = [ 25423.61181129 28799.50849876  9517.54482827 27275.19296144
 12460.2541769  25883.7888204  10393.9452616  26008.572598]

3 个答案:

答案 0 :(得分:2)

您不能将float用于range()函数。

请参阅:https://docs.python.org/3/library/stdtypes.html#range

  

(len(randnum))/ 3

那是漂浮的!

可能的解决方法:

int((len(randnum))/3)

好的,也许您应该尝试随机

具有重复性

import random

original_list =[ i for i in range(20)]

X = random.sample(original_list, int(len(original_list)/3))

Y = random.sample(original_list, int(len(original_list)/3))

Z = random.sample(original_list, int(len(original_list)/3))

样本输出

X:[7、3、18、15、19、1]

Y:[6、13、17、4、14、5]

Z:[19、2、8、18、13、17]

无重复

from random import shuffle

shuffle(original_list)

list(zip(*[iter(original_list)]*int(len(original_list)/3)))

样本输出

[(17,13,15,5,16,12),(14,4,18,2,19,6),(10,11,7,7,3,1,0)]

答案 1 :(得分:1)

如果我遵循您的目标,则一种简单的方法是将列表的副本随机排列,然后从0开始依次是每个第3个元素,然后是1,然后是2:

tmp_data = data.copy()
random.shuffle(tmp_data)
new_lists = [tmp_data[i::3] for i in range(3)]

这给了我例如

In [361]: new_lists
Out[361]: 
[[13749.12915211,
  26008.572598,
  25423.61181129,
  8767.68292925,
  12460.2541769,
  26308.21887981,
  59.18013391],
 [9828.75690047,
  20718.85232457,
  10273.65018539,
  9517.54482827,
  27275.19296144,
  8357.05103068,
  5949.58907673],
 [28799.50849876,
  12159.7881626,
  25883.7888204,
  16333.1546026,
  10393.9452616,
  31826.29595355]]

然后您可以做

X, Y, Z = new_lists

如果您坚持使用单独的命名变量。

(您也可以简单地执行tmp_data = random.sample(data, len(data))来获得列表的随机排列,但是由于某些原因,我发现这比混洗还不清楚。不确定为什么。)

答案 2 :(得分:0)

您可以在此处使用random,但是还需要确保不再使用该random int,我的方法是将其附加到used列表中,并检查该列表是否可以再次使用,只要将它们拆分成20,就可以使用//地板划分和%帮助您创建两个包含7个项目的列表和6个项目之一。

import random

data = [
    59.18013391,12159.7881626,26308.21887981, 8357.05103068,
    20718.85232457,16333.1546026,9828.75690047, 10273.65018539,
    5949.58907673, 8767.68292925, 31826.29595355, 13749.12915211,
    25423.61181129, 28799.50849876, 9517.54482827, 27275.19296144,
    12460.2541769, 25883.7888204, 10393.9452616, 26008.572598
]
y = len(data)//3
z = int((len(data) % 3)/2)
used = []
l1 = []
l2 = []
l3 = []

for i in range(y):
    x = random.randint(0, len(data)-1)
    while x in used:
        x = random.randint(0, len(data)-1)
    used.append(x)
    l1.append(data[x])

for i in range(y+z):
    x = random.randint(0, len(data)-1)
    while x in used:
        x = random.randint(0, len(data)-1)
    used.append(x)
    l2.append(data[x])

for i in range(y+z):
    x = random.randint(0, len(data)-1)
    while x in used:
        x = random.randint(0, len(data)-1)
    used.append(x)
    l3.append(data[x])
chrx@chrx:~/python/stackoverflow/9.23$ python3.7 loop.py 
l1:  [8357.05103068, 10273.65018539, 26008.572598, 5949.58907673, 28799.50849876, 8767.68292925]
l2:  [25423.61181129, 13749.12915211, 26308.21887981, 9828.75690047, 59.18013391, 16333.1546026, 27275.19296144]
l3:  [12460.2541769, 12159.7881626, 9517.54482827, 10393.9452616, 25883.7888204, 31826.29595355, 20718.85232457]