检查Python列表中的下一个对象

时间:2016-09-19 22:02:18

标签: python

我有一个list(来自CSV),其中包含以下信息结构:

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并将其用作列表,但我不知道如何跟踪线条。我的第一个想法是创建一个dicts列表,其中每个dict包含行和内容的索引号,然后我可以遍历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")

但是我不确定这是最简单也是最好的方式,所以如果有可能,有人可以告诉我一个更简单的解决方法,我真的很感激。

6 个答案:

答案 0 :(得分: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']

你也可以使用zip来缩短它,但可能不太可读:

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

答案 1 :(得分:2)

这里对问题略有不同 - 搜索包含字符串element.onclick = function() { if (isValidInput(inputValue)) { // More code here } } form.onsubmit = function() { if (isValidInput(inputValue)) { // More code here } } function isValidInput(inputValue) { // Check that input is valid // Return true / false } 的行,然后将该行与前一行连接起来。这会产生更简单的代码:

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))

不清楚输出的预期是什么 - 你提到CSV意味着输出列表应包含单个字段,在这种情况下,结果应该是列表列表。像这样:

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

将创建此列表列表:

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

答案 2 :(得分: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))
            )
        )
    )

答案 3 :(得分: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]]

答案 4 :(得分: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

答案 5 :(得分: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)