二维元组 vs 有序字典 vs 元组列表

3
假设我有一个不可变的键值对列表。
"banana" : "yellow"
"apple" : "red"
"kiwi" : "green"

唯一重要的是顺序,我永远不需要直接通过键访问项目,只需要按顺序迭代它们并接收一对值。

所以,考虑到上面所说的,哪个更推荐,二维元组、字典还是元组列表?

from collections import OrderedDict    

two_d_tuple = (
('banana', 'yellow'),
('apple', 'red'),
('kiwi', 'green')
)

list_of_tuples = [
('banana', 'yellow'),
('apple', 'red'),
('kiwi', 'green')
]

ordered_dict = OrderedDict(list_of_tuples)

4
顺便提一下,“2d_tuple”不是有效的Python标识符。如果您更改名称,StackOverflow的语法突出显示器可能会更满意您的帖子 :-) - mgilson
@mgilson忘记了,已修复! - Mojimi
查看所有的定义,你会得到答案。每种类型都有自己的特点和用例。简而言之,使用最适合你的那个,并且为此你需要检查每一个 :) - Moinuddin Quadri
@Mojimi,你想按照键或值的升序字母顺序排列吗? - lmiguelvargasf
还有其他限制吗?性能或空间方面的限制吗? - ppasler
显示剩余6条评论
3个回答

5
如果您不需要基于键进行任何查找,则可以使用元组序列。这里没有必要创建字典 - 无论如何,您都需要创建元组序列来构建字典。
如果您需要根据键查找项目,则应使用OrderedDict。

3

决定最佳格式的方法是查看性能时间...

性能时间计算为在执行OrderedDict之前的时间与执行之后的时间之间的差异;如下面的示例所示:

def compare_time(list_of_tuples):
   start=datetime.datetime.now()
   ordered_dict = OrderedDict(list_of_tuples)
   return datetime.datetime.now()-start

从这个例子中很明显可以看出,基于所示的列表,list_of_tuples将需要最少的时间。

ori@sonoma:~$ python3 stack.py 
dict 0:00:00.000016
two_d_tuple 0:00:00.000014
list_of_tuples 0:00:00.000009

说了这么多,我不确定你希望输出的顺序是什么,因为每种类型的键值对都会返回不同的顺序...

dict OrderedDict([('banana', 'yellow'), ('kiwi', 'green'), ('apple', 'red')]) 
two_d_tuple OrderedDict([('banana', 'yellow'), ('apple', 'red'), ('kiwi', 'green')]) 
list_of_tuples OrderedDict([('banana', 'yellow'), ('apple', 'red'), ('kiwi', 'green')]) 

2
你正在描述一个键/值对的有序集合。这正是 `collections.OrderedDict` 的用途,因此我肯定会使用它。
你的元组和元组列表都是试图从更基本的数据结构中构建复杂的数据结构。当然,这是可以的,但为什么不使用已经构建好的数据结构呢?这就是“电池包含”的意义所在。
此外,由于 `collections.OrderedDict` 准确反映了你所描述的数据结构,因此更高级的功能(例如仅迭代键)已经实现,而对于你的另外两个“自制”数据结构,你将不得不重新实现这些功能。

我不确定构建一个有序字典是否会带来太多的开销,如果原始问题不使用键来获取值的话。 - ppasler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接