3

だから私は未知の長さのリストで働いています。このリストを4つの部分に分割する必要があります。

パート1=リストの最初の20%

パート2=リストの20%から40%

パート3=リストの40%から80%

パート4=リストの80%から100%。

これに関する問題は、リストの要素が10未満の場合、リストの一部が空になることです。私の質問は、この問題をどのように回避するかです。

これは私が今持っているスクリプトです:

x = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]

twentyPercentOne = len(x) * 0.2

twentyPercentTwo = len(x) * 0.4

fourtyPercentThree = len(x) * 0.8

i = 0
j = 2

m = []
while j < (twentyPercentOne + 1):
    m.append(x[i:j])
    i = (i + 2)
    j = (j + 2)

h = []  
while j < (twentyPercentTwo + 1):
    h.append(x[i:j])
    i = (i + 2)
    j = (j + 2)

l = []        
while j < (fourtyPercentThree + 1):
    l.append(x[i:j])
    i = (i + 2)
    j = (j + 2)

t = x[i:len(x)]

出力:

[['one', 'two']]
[['three', 'four']]
[['five', 'six'], ['seven', 'eight']]
['nine', 'ten']

リストの長さが10未満の場合に出力します:x = ["one"、 "two"、 "three"、 "four"、 "five"、 "six"、 "seven"]

[['one', 'two']]
[]
[['three', 'four'], ['five', 'six']]
['seven']

誰かがこれを行う方法を知っていますか?私はPythonの問題よりも数学の問題の方が多いことを知っていますが、それを行う方法がわからず、何日も取り組んできました。助けていただければ幸いです。

ありがとう

4

2 に答える 2

7

これは、任意のサイズ (合計が 1 である限り) の任意の数の分割 (4 つだけでなく) に対して正しい方法である必要があります。

def percentage_split(seq, percentages):
   assert sum(percentages) == 1.0
   prv = 0
   size = len(seq)
   cum_percentage = 0
   for p in percentages:
       cum_percentage += p
       nxt = int(cum_percentage * size)
       yield seq[prv:nxt]
       prv = nxt

(これはジェネレーター関数です。次のように四分位数のリストを取得できます。

list(percentage_split(x, [0.25]*4))

)

numpy がインストールされている場合は、少し簡潔になる可能性があります。

from numpy import cumsum

def percentage_split(seq, percentages):
    cdf = cumsum(percentages)
    assert cdf[-1] == 1.0
    stops = map(int, cdf * len(seq))
    return [seq[a:b] for a, b in zip([0]+stops, stops)]

そして、4つの等しい四分位数だけが必要な場合...

numpy.split(seq, 4)
于 2013-01-11T15:17:59.717 に答える
0

一致する長さでこのようにリストを分割することはできないことは明らかです。しかし、ここに別の方法があります:

def do_split(x, percent):
    L = len(x)
    idx1 = [0] + list(int(L * p) for p in percent[:-1])
    idx2 = idx1[1:] + [L]
    return list(x[i1:i2] for i1,i2 in zip(idx1, idx2))

splits = [0.2, 0.4, 0.8, 1.0]
print do_split(["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"], splits)
# ---> [['one', 'two'], ['three', 'four'], ['five', 'six', 'seven', 'eight'], ['nine', 'ten']]
print do_split( ["one", "two", "three", "four", "five", "six", "seven"], splits)
# --> [['one'], ['two'], ['three', 'four', 'five'], ['six', 'seven']]
于 2013-01-11T15:24:04.210 に答える