我具有表示坐标的一系列的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
>>> 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top