题
我具有表示坐标的一系列的Python元组:
tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
我想创建以下列表:
l = []
for t in tuples:
l[ t[0] ][ t[1] ] = something
我得到一个IndexError:列表索引超出范围
。我的背景是在PHP和我预期在Python可以创建索引开始> 0,即让差距,然后填满他们的名单,但似乎你不能。
我们的想法是有名单后进行排序。我知道我可以用字典做到这一点,但据我所知词典不能用键进行排序。 更新:我现在知道他们可以 - 看接受的解决方案。
编辑: 我想要做的就是创建一个二维数组,将表示与元坐标描述的基质,然后按顺序重复它。 如果我使用一本字典,我都难保遍历键会为了 - >(0,0)(0,1)(0,2)(1,0)(1,1)(1,2 )(2,0)(2,1)(2,2)
谁能帮助?
解决方案
你是什么意思正是“但据我所知词典不能用键进行排序”?
虽然这是不完全一样的“划分字典”,您的可以的很容易地把一本字典到一个列表,通过关键,这似乎是你后什么排序:
>>> tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
>>> l = {}
>>> for t in tuples:
... l[t] = "something"
>>> sorted(l) # equivalent to sorted(l.keys())
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 1)]
>>> sorted(l.items()) # make a list of (key, value) tuples, and sort by key
[((0, 0), 'something'), ((0, 1), 'something'), ((1, 0), 'something'), ((1, 1), 'something'), ((2, 1), 'something')]
(我转身something
到字符串“东西”只是为了让代码工作)
要充分利用本作但您的情况(如果我理解正确的话,那是),你仍然需要填充无值什么的字典每一个“空”的坐标元组)
其他提示
不,你不能创建空白列表。但是你可以创建一个字典,元组键:
tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = {}
for t in tuples:
l[t] = something
<强>更新强> 尝试使用 NumPy的时,它提供了宽范围的过矩阵和阵列操作。从上NumPy的自由PFD可在网站上(3.4.3扁平迭代索引)引用:“如前所述,X.flat返回迭代,将遍历整个阵列上(在C-连续样式与所述最后一个索引变化最快“的。看起来你需要的东西。
您应该看看类型的字典类似的东西。
for t in tuples:
if not l.has_key(t[0]):
l[t[0]] = {}
l[t[0]][t[1]] = something
遍历字典比遍历列表有点不同,虽然。您将有键(),价值观()和项目()功能,以帮助这一点。
编辑:尝试这样的排序:
for x in sorted(l.keys()):
for y in sorted(l[x].keys()):
print l[x][y]
您创建一个一维列表l
并希望使用它作为一个二维列表。
这就是为什么你会得到一个指标差。
您有以下选择: 创建地图,并使用该元组T作为索引:
l = {}
l[t] = something
,你会得到交运集团作为条目:
{(1, 1): something}
如果你想有一个传统的阵列结构,我会劝你看看 numpy的。随着numpy的你与“传统”的索引n维数组。
正如我所提到的使用numpy的,
与numpy的可以创建一个2维阵列,用零填充或1或... THA可以填充索引[X,Y]为所需的任何所需的值。 当然,你可以通过行和列或整个阵列作为一个列表进行迭代。
如果你知道的大小,你的手之前,你可以做这样一个列表的列表
>>> x = 3
>>> y = 3
>>> l = [[None] * x for i in range(y)]
>>> l
[[None, None, None], [None, None, None], [None, None, None]]
然后你就可以像迭代您最初建议。
扩展的内森答案,
tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
x = max(tuples, key = lambda z : z[0])[0] + 1
y = max(tuples, key = lambda z : z[1])[1] + 1
l = [[None] * y for i in range(x)]
然后你可以做任何你想要的。
正如前面提到的,你不能有间隙使列表和字典可能是更好的选择在这里。关键是要确保当你把位置l[t[0]]
东西t[1]
存在。对于这一点,我会使用一个 defaultdict
import collections
tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = collections.defaultdict(dict)
for t in tuples:
l[t[0]][t[1]] = something
由于l
是defaultdict,如果l[t[0]]
不存在,它会创建一个空的字典为你把你的something
在位置t[1]
。
注意:此最终被相同@ unwesen的回答,而没有用于内部字典的存在手工检查次要乏味。粉笔它并发应答。
给出的解决方案字典可能是最适合大多数的目的。为了您,为了遍历键的问题,通常你会而不是通过的坐标空间迭代的,而不是字典键,正是你必须为你的名单列表相同的方式。用不用彷徨,你可以指定要使用的空白单元格,或者使用“collections.defaultdict
”来定义字典创建时默认的缺省值。例如
for y in range(10):
for x in range(10):
value = mydict.get((x,y), some_default_value)
# or just "value = mydict[x,y]" if used defaultdict
如果你需要列出的实际列表,你可以按照以下直接构造它:
max_x, max_y = map(max, zip(*tuples))
l=[[something if (x,y) in tuples else 0 for y in range(max_y+1)]
for x in xrange(max_x+1)]
如果元组的名单很可能是长,性能方面的原因,您可能需要使用一组查找,如“(x,y) in tuples
”执行列表的扫描,而不是通过哈希快速查找。即,改变第二行:
tuple_set = set(tuples)
l=[[something if (x,y) in tuple_set else 0 for y in range(max_y+1)]
for x in xrange(max_x+1)]
我想你只申报一个一名维列表。
我想你把它声明为
l = [][]
修改强>:这是一个语法错误
>>> l = [][]
File "<stdin>", line 1
l = [][]
^
SyntaxError: invalid syntax
>>>