2016-02-15 43 views
0

我想分配輸入,相對於他們的len() s的相關領域。問題是這些領域也有條件。分配輸入,就其len()

第1到第10個字段,允許< 25個字符。第11到第20個字段允許< 100個字符。

我要的是,下面的代碼採取user_input[i],檢查len(),如果len(user_input[i])是< 25個字符,賦值給第一個字段,然後移動到下一個輸入;但在檢查其len()時也從第二場開始。

當輸入的輸入長度在25到100個字符之間時,應將其分配給第11-20個字段。就像上面一樣,一旦第11位填滿,它應該從第12場開始。

請注意,我希望腳本先檢查<條件。如果填充了該字段,則可以將輸入分配給輸入端<。

下面的代碼,是不完整的,並且遠遠不是真實的,這就是我可以做:)

import csv 
import os 

user_input = [] 
def getting_text(entered_text): 
     if entered_text == "done": 
      print "entering the texts are done!" 
     elif entered_text == "": 
      getting_text(raw_input("you've entered an empty text, please try again\n")) 
     else: 
       user_input.append(entered_text) 
       getting_text(raw_input("Enter the text or write done to finish entering\n"))     
getting_text(raw_input("Enter the first text\n")) 

with open("trial.csv", "w") as csvfile: 
    fieldnames = ["1st field", "2nd field", "3rd field", "4th field", "5th field", "6th field", "7th field", "8th field", "9th field", "10th field", "11th field", "12th field", "13th field", "14th field", "15th field", "16th field", "17th field", "18th field", "19th field", "20th field"] 

    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 

    writer.writeheader() 
    for i in range(0, len(user_input)): 

     writer.writerow({"1st field": user_input[i], "2nd field": "input will be here", "3rd field": "input will be here", "4th field": "input will be here", "5th field": "input will be here", "6th field": "input will be here"}) #and so on :) 

os.startfile("trial.csv") 

這是這個問題的延續,所以請考慮 你」再談到這裏新啓動的:) Python list order

+0

因此,您希望將用戶輸入置於足夠長的第一個未佔用字段中以容納該輸入。你的問題是什麼? –

+0

我想不出如何做到這一點。我假設我必須爲每個字段分配一個變量並將它們設置爲25/100;然後在forloop中,它會檢查len(user_input [i])並將其分配給相關字段?我迷路了。 – firko

回答

1

對於每一個指標的「桶」,你可以創建一個迭代器。然後,使用itertools.chain將這些迭代器鏈接在一起。一旦一個桶被耗盡,它將自動使用下一個桶,並且由於基礎迭代器是共享的,所以不會使用兩次索引。對於存儲桶,您可以使用range(或者對於Python 2.x使用xrange),並且如果最後一個存儲桶是開放式的,請使用itertools.count

bucket1 = iter(range(0, 10)) 
bucket2 = iter(range(10, 20)) 
bucket3 = iter(itertools.count(20)) # or another range with upper bound 

sub25 = itertools.chain(bucket1, bucket2, bucket3) 
from25to100 = itertools.chain(bucket2, bucket3) 
allOther = bucket3 

實施例(僅使用隨機數,沒有文件和用戶輸入和不同長度字符串):

target = [None] * 100 
for _ in range(70): 
    n = random.randint(0, 150) 
    if n < 25: 
     i = next(sub25) 
    elif n < 100: 
     i = next(from25to100) 
    else: 
     i = next(allOther) 

    print(n, "goes to position", i) 
    target[i] = n 

此後,target列表最終成爲(用「桶」細分):

[0, 13, 22, 13, 6, 4, 21, 9, 6, None, 
43, 51, 25, 41, 93, 98, 41, 43, 33, 68, 
145, 121, 138, 103, 145, 124, 133, 127, 110, 109, 106, 116, 132, 77, 109, 25, 35, 43, 67, 46, 53, 28, 103, 129, 143, 112, 76, 66, 47, 125, 86, 86, 71, 73, 112, 113, 126, 89, 57, 26, 51, 107, 33, 115, 51, 54, 70, 50, 44, 91, 30, ...] 

注意一些水桶怎麼不是100%滿,因爲沒有足夠的號碼,該桶被捲起,和一些數字更高桶比他們的價值會建議結束,BEC當他們正確的桶已經滿了時,他們會被推出。


更新:有兩個問題,您updated code

  • 無論是環比range(len(user_input)),或更好,環user_input直接
  • 你混合起來的位置在何處放置物品i和它來自於var

嘗試將您的循環更改爲:

for inp in user_input: 
    n = len(inp) 
    ... 
    print(inp, "goes to position", i) 
+0

爲什麼downvote?我誤解了這個問題嗎?或者有沒有這種情況發生?如果是這樣,我想知道,所以我可以改善我的答案。 –

+0

在這裏'xrange's會比'range'更好嗎?雖然我懷疑這是貶低選民的想法。 –

+0

@ das-g同意,沒有看到Python 2.7標籤。但只有幾十個指數,使用'範圍'也不應該是一個問題。 –