【问题标题】:Trying to form a list that takes its size from the number of elements in another list and appends the elements of the first list to the new list试图形成一个列表,该列表从另一个列表中的元素数量中获取其大小,并将第一个列表的元素附加到新列表中
【发布时间】:2019-02-27 11:20:42
【问题描述】:
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]

【问题讨论】:

标签: python


【解决方案1】:

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, 3, 1, 0)]

【讨论】:

  • 那么解决办法是什么?
  • 但是,如果您从原始列表中分别采样 3 次,有时您会在多个输出中得到相同的值(例如 18 次)。 OP的示例没有,所以不清楚是否允许。
【解决方案2】:

您可以在此处使用 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]

【讨论】:

    【解决方案3】:

    如果我遵循您的目标,一种简单的方法是随机播放列表的副本,然后从 0、1、2 开始获取每个第 3 个元素:

    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)) 来获得列表的随机排列,但由于某种原因,我发现这比改组更清楚。不知道为什么。)

    【讨论】:

    • 你是我的英雄
    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2017-04-12
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多