【问题标题】:Python add string to a list loopPython将字符串添加到列表循环
【发布时间】:2015-07-31 10:23:12
【问题描述】:

我有一个来自 Python HTMLParser 的 var vk_read,它处理这样的数据:['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()- 并得到相同的结果。 (!!!)

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

注意事项: 我已按照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

注意 上次更改后

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

【问题讨论】:

  • for line in vk_read: 为什么不在 for 循环中使用 line
  • 最好不要将变量命名为 list,因为它会影响常用的内置函数。
  • list.insert(0, vk_read) 是一种非常低效的操作,因为每次插入一个项目时,所有其他项目都需要向右移动一个位置。如果您的列表变大,这将变得非常缓慢。
  • @trianglesis 是你的实际缩进吗?如果是这样,id_tag= re.findall(...) 之后的所有内容都是错误的。我认为它应该都在for line in href 循环中
  • @JulienSpronc 我已经做了一些改变

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


【解决方案1】:

怎么样:

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

【讨论】:

    【解决方案2】:

    您似乎在一个循环中,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
    

    【讨论】:

    • 尝试不同的结构并尝试制作可读的代码,但现在我有:vk_ids.append(vk_read)&lt;class 'list'&gt; 但列表仍然没有从变量中收集不同的数据。我失去了一些东西。
    【解决方案3】:

    在您的代码中,您没有在循环内使用 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 似乎是一个字符串而不是一个列表。

    【讨论】:

    • 他的示例代码实际上等价于lis = reversed([vk_read for line in vk_read if vk_read != ''])if vkread != '' 可以跳过,因为如果 vk_read 等于空字符串,则不会发生循环。使用 reversed 是因为 OP 正在使用 list.insert(0, vk_read)。最有效的等价物是lis = len(vk_read) * [vk_read]reversed 并不重要,因为我们只是插入vk_read,而不是vk_read 的有序内容。)
    • 我只是假设这是一个错误,因为循环内没有引用行
    • 虽然这可能正确也可能不正确,但您应该尝试确定 OP 遇到的问题以及为什么这可以帮助解决问题。
    • @FrankV 让我知道我上次的编辑是否更有帮助。
    • if vk_read: vk_ids = [line for line in vk_read if line != ''] print(vk_ids) 仍然有相同的,但对于每个字符是分开的:['i', 'd' , '1', '6', '8', '2', '3', '3', '0', '9', '5']
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 2022-11-30
      • 1970-01-01
      • 2019-02-03
      相关资源
      最近更新 更多