2015-09-10 516 views
-2

我正在用C++中的字符串分隔符分割文檔。for循環的最後一個元素

這是一個用於演示問題的最小Python代碼。 LA是由 'x' 的分裂得到(A,B,B)和(c,d)(僅元素X之間,或介於x和文件的結束被記錄)

la = ['a','x','a','b','b','x','c','d'] 

out = [] 
tmp = [] 
inside = False 
for a in la: 
    if a == "x": 
     if inside: 
      out.append(tmp) 
      tmp = [] 
     inside = True 
     continue 
    if inside: 
     tmp.append(a) 
out.append(tmp) 

for a in out: 
    print a 

有代碼的重複這裏是最後一個元素out.append(tmp)。我如何在循環中移動它? (out.append(tmp)實際上是一些大的代碼,它很容易在不同的地方寫入錯誤)。

P/S:

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 

using namespace std; 

int main() { 
    // your code goes here 
    stringstream instream("a x b c d x c d"); 
    vector<string> result; 
    string word, content; 
    while(getline(instream, word, ' ')) { 
     if (word == "x") { 
      result.push_back(content); 
      content = ""; 
      continue; 
     } 
     content += word; 
    } 
    return 0; 
} 
:由於實際的代碼是在C++中,從Python中沒有的特殊功能是允許在解決問題

一個最小的C++代碼調用,我從一個字符串流閱讀

+1

這些與C++有關嗎? – Slava

+4

那麼這不是Python的問題呢?我希望這裏的C++專家希望看到一個C++ [mcve],而不是用Python編碼的。 –

+3

爲什麼在python中給出一個例子,當你的問題在C++中?爲什麼不直接給你用C++嘗試的東西,讓人們用這些代碼來幫助你? – heinst

回答

1

不知道爲什麼你會不只是追加循環之外,但你可以檢查長度在循環趕末元素:

out = [] 
tmp = [] 
for ind, ele in enumerate(la): 
    if ele == "x": 
     if tmp: 
      out.append(tmp) 
     tmp = [] 
    elif ind == len(la) - 1: 
     tmp.append(ele) 
     out.append(tmp) 
    else: 
     tmp.append(ele) 

可以代替枚舉的使用範圍。

如果你想繼續使用,你可以刪除其他:

for ind, ele in enumerate(la): 
    if ele == "x": 
     if tmp: 
      out.append(tmp) 
     tmp = [] 
     continue 
    elif ind == len(la) - 1: 
     out.append(tmp) 
    tmp.append(ele) 

我有C++,但使用stringstream.eof捕捉文件的末尾可能會做你想做的零經驗:

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 

using namespace std; 

int main() { 
    // your code goes here 
    stringstream instream("x a x b c d x c d x"); 
    vector<string> result; 
    string word, content; 
    while(true) { 
     getline(instream, word, ' '); 
     if (instream.eof()){ 
      if (word != "x"){ 
      content += word; 
      } 
      cout << content << "\n"; 
      break; 
     } 
     if (word == "x") { 
      result.push_back(content); 
      cout << content << "\n"; 
      content = ""; 
      continue; 
     } 

     content += word; 
    } 
    return 0; 
} 

輸出:

a 
bcd 
cd 

您還需要在那裏,他第一個字符是辦理情況你會輸出一個空字符串

+0

這是一個文件流(就像Python中的生成器),所以我不知道提前預約。 –

+0

你能抓住EOF並使用與長度相同的邏輯嗎? –

相關問題