2016-09-19 49 views
0

我有一個list(從CSV)具有以下信息結構:檢查在Python列表中的下一個對象

Item 1 
NUMBER Random ID 
Item 2 
NUMBER Random ID 
Item 3 
Item 4 
Item 5 
NUMBER Random ID 

而且我想創建一個新的list(CSV),看起來像這樣:

Item 1 NUMBER Random ID 
Item 2 NUMBER Random ID 
Item 5 NUMBER Random ID 

所以我想從Item 1,2,3...和它下面的行創建一個字符串,如果下一行不包含字符串NUMBER

我可以讀取CSV並將其用作列表,但是我不知道如何跟蹤線條。我的第一個想法是創建一個字典列表,其中每個字典都包含該行的索引號和內容,然後我可以遍歷list_with_dicts並檢查原始列表中的下一行。

raw_list = [] 
num = 0 
list_with_dicts = [] 
for x in raw_list: 

    num2 = num + 1 
    dict1 = {} 
    dict1['index'] = num2 
    dict1['çontent'] = x 
    list_with_dicts.append(dict1) 

for d in list_with_dicts: 

    number_of_next_line = d['index'] + 1  

    if "NUMBER" in raw_list[number_of_next_line]: 
     new_string = "%s %s" % (d[content], raw_list[number_of_next_line]) 
    else: 
     print("String without number") 

但是我不知道它是做的最簡單,最好的辦法,所以我會很感激,如果有人能告訴我一個簡單的解決辦法,如果有可能。

+0

請拉布勒列你從CSV中獲得。 – Dan

+0

正如你有工作代碼,這可能更適合於[CodeReview](http://codereview.stackexchange.com/) – trincot

+0

@丹沒有列。它只包含一列。 – rihe

回答

1

隨着列表理解:

result = ["%s %s" % (x,raw_list[i+1]) for i, x in enumerate(raw_list) 
       if i < len(raw_list)-1 and 'NUMBER' in raw_list[i+1]] 
0
new_list=[] 
i=0 
while i < len(raw_list)-1: 
    if raw_list[i+1][:len("NUMBER")] == "NUMBER": 
     new_list.append("%s %s" % (raw_list[i], raw_list[i+1])) 
     i=i+2 
    else: 
     i=i+1 
1

隨着enumerate(<list>)可以反覆指標和元素,讓您可以輕鬆地檢查下一個元素:

result = [] 
for i, val in enumerate(lst): 
    if i == len(lst) - 1: 
     break # to avoid IndexError 
    if lst[i + 1][:3] == 'NUM': 
     result.append('%s %s' % (val, lst[i + 1]) 

版本函數式編程:

result = \ 
    list(
     map(
      lambda i: 
       '%s %s' % (lst[i - 1], lst[i]), 
      filter(
       lambda i: 
        lst[i][:3] == 'NUM', 
       range(1, len(lst)) 
      ) 
     ) 
    ) 
0
result = [] 
i, l = 0, len(raw_input) 
while i < l: 
    if 'item' in raw_input[i]: 
    result.append(raw_input[i]) 
    else: 
    result[-1] += raw_input[i] 
    i += 1 
return filter(lambda x: 'random' in x.lower(), result) 
2

有趣的問題!

raw_list = ["Item 1", 
      "NUMBER Random ID1", 
      "Item 2", 
      "NUMBER Random ID2", 
      "Item 3", 
      "Item 4", 
      "Item 5", 
      "NUMBER Random ID5"] 

clean_list = [raw_list[i]+" "+raw_list[i+1] for i in range(0,len(raw_list),2) if "Item" not in raw_list[i+1]] 
print clean_list 

輸出:

['Item 1 NUMBER Random ID1', 'Item 2 NUMBER Random ID2', 'Item 5 NUMBER Random ID5'] 

您也可以使用壓縮到更短,但也許不易閱讀:

clean_list1 = [i1+" "+i2 for i1,i2 in zip(raw_list[::2],raw_list[1::2]) if "Item" not in i2] 
print clean_list1 
2

這裏有一個稍微不同的看法的問題 - 搜索線是包含字符串NUMBER,然後將該行與前一行相連。這將產生更簡單的代碼:

l = ['Item 1', 'NUMBER Random ID', 'Item 2', 'NUMBER Random ID', 'Item 3', 'Item 4', 'Item 5', 'NUMBER Random ID'] 

result = [] 
for i, s in enumerate(l[1:], 1): 
    if 'NUMBER' in s: 
     result.append('{} {}'.format(l[i-1], s)) 

或列表的理解:

result = ['{} {}'.format(l[i-1], s) for i,s in enumerate(l[1:], 1) if 'NUMBER' in s] 

目前還不清楚什麼是預期的那樣輸出 - 你提到CSV這意味着輸出列表應該包括各個字段,在這種情況下,結果應該是列表的列表。事情是這樣的:

result = [[l[i-1], s] for i,s in enumerate(l[1:], 1) if 'NUMBER' in s] 

這將創建列表名單:

[['Item 1', 'NUMBER Random ID'], 
['Item 2', 'NUMBER Random ID'], 
['Item 5', 'NUMBER Random ID']] 

它可以很容易地保存到CSV文件與csv模塊:

import csv 

with open('result.csv', 'w') as f: 
    csv.writer(f).writerows(result) 
相關問題