Python 什么';在列表中循环并创建单个字符串的最快方法是什么?

Python 什么';在列表中循环并创建单个字符串的最快方法是什么?,python,nested-lists,Python,Nested Lists,例如: list = [{"title_url": "joe_white", "id": 1, "title": "Joe White"}, {"title_url": "peter_black", "id": 2, "title": "Peter Black"}] 我如何有效地循环此过程以创建: Joe White, Peter Black <a href="/u/joe_white">Joe White</a>,<a href="/u/pete

例如:

list = [{"title_url": "joe_white", "id": 1, "title": "Joe White"},
        {"title_url": "peter_black", "id": 2, "title": "Peter Black"}]
我如何有效地循环此过程以创建:

Joe White, Peter Black
<a href="/u/joe_white">Joe White</a>,<a href="/u/peter_black">Peter Black</a>
乔·怀特、彼得·布莱克 ,
谢谢。

第一点很简单:

', '.join(item['title'] for item in list)
第二种方法需要更复杂的东西,但本质上是一样的:

','.join('<a href="/u/%(title_url)s">%(title)s</a>' % item for item in list)
,。联接(“”%item用于列表中的项)
两者都使用,类似于列表理解,无需额外创建列表

类节点()
class node():
    titles = []
    urls = []
    def add_name(self, a_title):
        self.titles.append(a_title)
    def add_url(self, a_title_url, a_title):    
        self.urls.append('<a href="/u/%s">%s</a>' % (a_title_url, a_title))

node = node()
for entry in list:
    node.add_name(entry["title"])
    node.add_url(entry["title_url"],entry["title"])

print ','.join(node.titles)
print ','.join(node.urls)
标题=[] URL=[] def添加名称(自我,标题): self.titles.append(a_title) def add_url(self,a_title_url,a_title): self.url.append(“”%(a_title\u url,a_title)) node=node() 对于列表中的条目: node.add_name(条目[“title”]) 添加url(条目[“标题”]、条目[“标题”]) 打印“,”连接(节点标题) 打印“,”.join(node.url)
以下是一些速度比较,以检查您所获得的这两种方法

首先,我们创建100000个条目的列表;无聊,也许不是一个真正的样本,因为有较短的字符串,但我现在不担心这一点

>>> items = [{"title_url": "abc", "id": i, "title": "def"} for i in xrange(100000)]
首先,Michael Mrozek的回答:

>>> def michael():
...     ', '.join(item['title'] for item in items)
...     ','.join('<a href="/u/%(title_url)s">%(title)s</a>' % item for item in items)
... 
小结:不必担心重复查看列表两次,再加上生成器理解,它比list.append的开销要便宜;Michael的解决方案在100000个条目上快了约15%

第二,您应该使用
'%(…)s'%dict()
还是
'%s'%tuple()
。把Michael的答案看作是两个答案中更快更简单的一个,下面是michael2:

>>> def michael2():
...     ', '.join(item['title'] for item in items)
...     ','.join('<a href="/u/%s">%s</a>' % (item['title_url'], item['title']) for item in items)
... 
>>> timeit.timeit(michael2, number=100)
7.8054699897766113
比michael2慢一倍的阴影


最后,在Python 2.6中引入的基准
str.format
“字符串格式的未来”(尽管我仍然不明白为什么,我喜欢我的
%
,非常感谢;特别是因为它更快)

>>def michael_format():
...     ', '.加入(项目中项目的项目['title']
...     ','.联接(“”.format(**item)用于项目中的项目)
... 
>>>timeit.timeit(michael_格式,数字=100)
11.809207916259766
>>>def michael2_格式():
...     ', '.加入(项目中项目的项目['title']
...     ','.联接(“”.format(item['title\u url'],item['title']),用于项中的项)
... 
>>>timeit.timeit(michael2_格式,数字=100)
9.8876869678497314

11.81而不是9.70,9.89而不是7.81-它的速度慢了20-25%(还要考虑到它也是函数中使用它的第二个表达式。

恭喜,你写了太多的十行。(将Michael Mrozek的版本变成一个很长的一行代码,一次生成两个字符串是很简单的)@delnan我只做了一次迭代(除了两次连接),我想测试100000个条目。你觉得怎么样?
(列表中的条目的条目['title','*html模板*'%item])也是一次迭代;)(这就是我所说的“oneliner”-嗯,我的错)@delnan yep,不管怎么说,Michael正在做两次迭代。@systempuntoout:即使去掉了类系统(你到底为什么这么做?这会让它变得更混乱和更慢),你的也会更慢。数字即将到来。请记住,永远不要使用“列表”作为变量名称!重复使用字典是个好主意。与新str.format:','相同。join(''.format(**item)表示列表中的项目)@tokland,@Michael:在我的答案中添加了
str.format
的基准,比
str%
慢20-25%。同样在这两种情况下,对第二个使用
'%s'%()
使总数比
'%()s'%{}
快约25%。我甚至最初使用了普通的字符串格式,然后我改变了它;我很惊讶这两者之间有这么大的差异speed@Michael:还请记住,我的这些25%的数字是相当无用的,因为有
,'的“固定开销”。join(item['title']表示item in items)
。他们应该更高——可能在40%左右。“慢一倍”是一个荒谬的说法。测试类声明和对象创建是毫无意义的:),您可以让我的systempuntoout0更快地将项['title']存储在tmp变量中,避免双重访问(尽管比Michael解决方案慢)!干得好,吸取了教训,无论如何下次尽量避免那种微妙的傲慢语气,这不是一件好事。
>>> import timeit
>>> timeit.timeit(michael, number=100)
9.6959049701690674
>>> timeit.timeit(systempuntoout, number=100)
11.306489944458008
>>> def michael2():
...     ', '.join(item['title'] for item in items)
...     ','.join('<a href="/u/%s">%s</a>' % (item['title_url'], item['title']) for item in items)
... 
>>> timeit.timeit(michael2, number=100)
7.8054699897766113
>>> def systempuntoout0():
...     class node():
...             titles = []
...             urls = []
...             def add_name(self, a_title):
...                     self.titles.append(a_title)
...             def add_link(self, a_title_url, a_title):
...                     self.urls.append('<a href="/u/%s">%s</a>' % (a_title_url, a_title))
...     node = node()
...     for entry in items:
...             node.add_name(entry["title"])
...             node.add_link(entry["title_url"], entry["title"])
...     ', '.join(node.titles)
...     ','.join(node.urls)
... 
>>> timeit.timeit(systempuntoout0, number=100)
15.253098011016846
>>> def michael_format():
...     ', '.join(item['title'] for item in items)
...     ','.join('<a href="/u/{title_url}">{title}</a>'.format(**item) for item in items)
... 
>>> timeit.timeit(michael_format, number=100)
11.809207916259766
>>> def michael2_format():
...     ', '.join(item['title'] for item in items)
...     ','.join('<a href="/u/{0}">{1}</a>'.format(item['title_url'], item['title']) for item in items)
... 
>>> timeit.timeit(michael2_format, number=100)
9.8876869678497314