Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python填充列表_Python_List_Tuples - Fatal编程技术网

用python填充列表

用python填充列表,python,list,tuples,Python,List,Tuples,我有一系列表示坐标的Python元组: tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)] 我要创建以下列表: l = [] for t in tuples: l[ t[0] ][ t[1] ] = something 我得到一个索引器:列表索引超出范围 我的背景是PHP,我希望在Python中,您可以创建以index>0开头的列表,也就是说,创建空白,然后填充它们,但似乎不行 这样做的目的是在之后对列表进行排序。我知道我可以用字典来做这件事,但据我

我有一系列表示坐标的Python元组:

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
我要创建以下列表:

l = []
for t in tuples:
  l[ t[0] ][ t[1] ] = something
我得到一个索引器:列表索引超出范围

我的背景是PHP,我希望在Python中,您可以创建以index>0开头的列表,也就是说,创建空白,然后填充它们,但似乎不行

这样做的目的是在之后对列表进行排序。我知道我可以用字典来做这件事,但据我所知,字典不能按键排序。 更新:我现在知道他们可以-查看已接受的解决方案

编辑: 我想做的是创建一个2D数组,它将表示用元组坐标描述的矩阵,然后按顺序迭代它。 如果我使用字典,我不能保证迭代键的顺序是->(0,0)(0,1)(0,2)(1,0)(1,1)(1,2)(2,0)(2,1)(2,2)


有人能帮忙吗?

你应该看看dicts中的类似内容

for t in tuples:
  if not l.has_key(t[0]):
    l[t[0]] = {}
  l[t[0]][t[1]] = something
不过,遍历dict与遍历列表有点不同。您将使用keys()、values()和items()函数来帮助实现这一点

编辑:尝试以下方式进行订购:

for x in sorted(l.keys()):
   for y in sorted(l[x].keys()):
       print l[x][y]

不,不能创建有间隙的列表。但您可以使用元组键创建字典:

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = {}
for t in tuples:
    l[t] = something
更新:
尝试使用,它提供了对矩阵和数组的广泛操作。引用站点上提供的NumPy上的免费pfd(3.4.3平面迭代器索引):“如前所述,X.Flat返回一个迭代器,该迭代器将迭代整个数组(以C-连续样式,最后一个索引变化最快)。看起来就像您需要的一样。

我认为您只声明了一个一维列表

我想你申报为

l = [][]

编辑:这是一个语法错误

>>> l = [][]
  File "<stdin>", line 1
    l = [][]
           ^
SyntaxError: invalid syntax
>>> 
>>l=[]
文件“”,第1行
l=[]
^
SyntaxError:无效语法
>>> 

如前所述,您不能创建有间隙的列表,在这里字典可能是更好的选择。诀窍是确保当您将某物放置在
t[1]
位置时,
l[t[0]]
存在。为此,我将使用

由于
l
是一个默认dict,如果
l[t[0]]
不存在,它将为您创建一个空dict,以便您将
某物
放在
t[1]
位置


注意:这最终与@Unwsen的答案相同,不需要手动检查内部命令的存在性。将其记为并发回答。

您创建了一个一维列表
l
,并希望将其用作二维列表。 这就是为什么会出现索引错误

您有以下选项: 创建映射并使用元组t作为索引:

l = {}
l[t] = something
您将在l中获得以下条目:

{(1, 1): something}
如果你想要一个传统的数组结构,我建议你看看。使用numpy,你可以得到具有“传统”索引的n维数组

正如我提到的使用numpy

使用numpy,您可以创建一个二维数组,用0或1或。。。 您可以根据需要使用索引[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)]

然后你可以做任何你想做的事你说的“但据我所知字典不能按键排序”到底是什么意思

虽然这与“排序字典”并不完全相同,但您可以轻松地将字典转换为按键排序的列表,这似乎就是您所追求的:

>>> 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
转换为字符串“something”,只是为了让代码正常工作)


然而,为了在您的案例中使用此方法(如果我理解正确的话),您仍然需要为字典中的每个“空”坐标元组填充无值或其他内容)

所给出的dict解决方案对于大多数目的来说可能是最好的。对于按顺序迭代键的问题,通常会迭代坐标空间,而不是dict键,与列表的方式完全相同。使用.get,您可以指定用于空白单元格的默认值,或者可以使用“<代码>集合.Debug TDC< <代码>”来定义DICT创建时的默认值。例如

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)]

我想说你可以创建一个有间隙的列表,但在这种情况下你不应该这样做。好吧,谢谢你的提示,但是在那之后我如何对列表进行排序呢?请注意,这本词典只能通过元组进行索引-如果你想得到第一个偏移量为t[0]的东西,那你就倒霉了。不清楚您的预期用途是什么,所以这可能没问题。老实说,我不知道如何创建有间隙的列表。我知道NumPy支持稀疏结构。你是这个意思还是别的什么意思?嗯,dict是设计上不可排序的。你到底是什么意思?是的,使用元组作为索引可能更好:)我不同意使用元组索引-这取决于字典填充后的预期使用情况。问题显示分解的元组作为嵌套列表的两部分索引。除非你有一个合适的矩阵,否则列表结构的两部分列表很少是你想要的;通常你想要元组作为索引,我有一个合适的矩阵。有N*M个元组,其中N是第一个元组成员的最高值,M是所有元组中第二个元组成员的最高值。@Blair Conrad:是的,这取决于用法,因此我说“可能更好”-或者更确切地说,我说“可能”,但这是一个拼写错误:P@Gre
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)]