Python将字符串添加到列表循环中

时间:2015-05-19 14:15:19

标签: python string list loops python-3.x

我有一个来自Python vk_read的变量HTMLParser来处理这样的数据:['id168233095']

现在,我试图在脚本在列表中运行后从此var'vk_read'中收集所有数据。应该像:['id168233095', 'id1682334534', 'id16823453', 'etc...']

if vk_read:
    vk_ids = []
    for line in vk_read:
        if vk_read != '':
            vk_ids.append(vk_read)
            print(vk_ids)

结果如下:

['id168233095']
['id168233095', 'id168233095']
['id168233095', 'id168233095', 'id168233095']
['id168233095', 'id168233095', 'id168233095', 'id168233095']
['id168233095', 'id168233095', 'id168233095', 'id168233095', 'id168233095']
['id168233095', 'id168233095', 'id168233095', 'id168233095', 'id168233095', 'id168233095']

一些建议代码改变后(见本文末尾)

if vk_read not in vk_ids:
    vk_ids.append(vk_read)
print(vk_ids)

但在这种情况下,结果是:

['id45849605']
['id91877071']
['id17422363']
['id119899405']
['id65045632']
['id168233095']

这意味着我的vk_read最多添加10次,然后我的脚本开始添加下一个。

同时尝试list.insert() - 并获得相同的结果。 (!)

如何在脚本运行后运行此循环以在一个列表中捕获所有不同的结果,因为可以从解析的文件中找到数据。

Nota bene: 我已根据list1.append(list0)的建议更新了代码,但在我的情况下,此方法仍返回与上述相同的结果。 并更改了列表名称以避免进一步的混淆。

最后更新 感谢您的帮助,伙计们,您真的以正确的方式推动我:same on stackoverflow

  

问题似乎是您在每次迭代中将列表重新初始化为空列表:

from html.parser import HTMLParser
import re, sys, random, csv

with open('test.html', 'r', encoding='utf-8') as content_file:
    read_data = content_file.read()

vk_ids = []

class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        href = str(attrs)
        for line in href:
            id_tag = re.findall('/\S+$', href)
            id_raw = str(id_tag)

            if re.search('/\w+\'\)\]', id_raw):
                global vk_read
                vk_read = id_raw
            else:
                break
            for ch in ['/', ')', '[', ']', '"', "'"]:
                if ch in vk_read:

                    vk_read = vk_read.replace(ch, "")

            # https://stackoverflow.com/questions/30328193/python-add-string-to-a-list-loop
            for vk_id in vk_read:
                if vk_id not in vk_ids:
                    vk_ids.append(vk_read)
                    break
            print(vk_ids)
            break

N.B。 上次更改后

print(type(vk_ids))
<class 'list'>

4 个答案:

答案 0 :(得分:1)

怎么样:

vk_ids = []
if vk_read:
    for line in vk_read:
        vk_ids.append(format(line))
    print(vk_ids)

答案 1 :(得分:0)

在您的代码中,您没有在循环中使用line变量。在每次迭代中,您将插入整个vk_read变量。

假设vk_read是一个列表,您可以使用列表解析:

lis = [line for line in vk_read if line != '']
print lis

如果你需要它反转(就像你使用insert一样),只需使用reversed

lis = list(reversed([line for line in vk_read if line != '']))

但是,vk_read似乎是一个不是列表的字符串。

答案 2 :(得分:0)

看起来你在一个循环中,vk_read是一个在每次迭代时都会改变的字符串:

vk_ids = [] ## initialize list outside the main loop

## main loop
for some_variable in some_kind_of_iterator: ## this is just a placeholder, i don't know what your loop looks like.

    ## get the value for vk_read
    vk_read = ...

    ## append to vk_ids
    if vk_read and vk_read not in vk_ids:
        vk_ids.append(vk_read)

print vk_ids

答案 3 :(得分:0)

我的不好,我做错了,并且运行迭代和列表追加所有时间擦除上一个列表。 Here is comment about it