Python 用其他数组填充二维数组的一维

Python 用其他数组填充二维数组的一维,python,arrays,list-comprehension,Python,Arrays,List Comprehension,我有两份清单: a=[[10, 0], [12,1], [13, 8], [2, -3]] b=[1, 2, -30, 404] 我想将a[*][1]值替换为b中的值,因此我的结果如下所示: [[10, 1], [12, 2], [13, -30], [2, 404]] 一个显而易见的方法(对我来说,作为一名真正的C程序员)是: for i in range(len(a)): a[i][1]=b[i] 但不知怎么的,这感觉不是很像蟒蛇 我该如何以蟒蛇式的方式做到这一点 此外,b-列表

我有两份清单:

a=[[10, 0], [12,1], [13, 8], [2, -3]]
b=[1, 2, -30, 404]
我想将
a[*][1]
值替换为
b
中的值,因此我的结果如下所示:

[[10, 1], [12, 2], [13, -30], [2, 404]]
一个显而易见的方法(对我来说,作为一名真正的C程序员)是:

for i in range(len(a)):
   a[i][1]=b[i]
但不知怎么的,这感觉不是很像蟒蛇

我该如何以蟒蛇式的方式做到这一点

此外,
b
-列表的元素可能比
a
多或少。如果数量较少,则
a
中的其余元素应保持不变

a=[[10, 0], [12,1], [13, 8], [2, -3]]
b=[10, 20]

result=[[10, 10], [12,20], [13, 8], [2, -3]]
如果更多,我想添加带有默认第一个元素的新条目(例如
None


这可以通过列表理解来实现吗?

使用
zip
和列表理解:

>>> a[:] = [[x, z] for (x, y), z   in zip(a, b)]
>>> a
[[10, 1], [12, 2], [13, -30], [2, 404]]
对于列表长度不等的情况,可以使用
iterools.izip\u longest

>>> from itertools import izip_longest
>>> a = [[10, 0], [12,1], [13, 8], [2, -3]]
>>> b = [10, 20]
>>> sen = object()
#len(a) > len(b)
>>> a[:] = [[x, y if z is sen else z]
                          for (x, y), z in izip_longest(a, b, fillvalue=sen)]
>>> a
[[10, 10], [12, 20], [13, 8], [2, -3]]

>>> a = [[10, 0], [12,1]]
>>> b = [100, 200, -30, 404]
#len(b) > len(a)
>>> a[:] = [[None if x is sen else x , z] 
                          for (x, y), z in izip_longest(a, b, fillvalue=[sen]*2)]
>>> a
[[10, 100], [12, 200], [None, -30], [None, 404]]

如果您认为列表的理解太难理解,请使用
生成器功能

def solve(a, b):
    sen = object()
    if len(a) == len(b):
        for (x, y), z in zip(a, b):
            yield [x, z]
    elif len(a) > len(b):
        for (x, y), z in izip_longest(a, b, fillvalue=sen):
            yield [x, y if z is sen else z]
    else:
        for (x, y), z in izip_longest(a, b, fillvalue=[sen]*2):
            yield [None if x is sen else x , z]
演示:

>>> list(solve([[10, 0], [12,1], [13, 8], [2, -3]], [1, 2, -30, 404]))
[[10, 1], [12, 2], [13, -30], [2, 404]]

>>> list(solve([[10, 0], [12,1], [13, 8], [2, -3]], [10, 20]))
[[10, 10], [12, 20], [13, 8], [2, -3]]

>>> list(solve([[10, 0], [12,1]], [100, 200, -30, 404]))
[[10, 100], [12, 200], [None, -30], [None, 404]]

enumerate
通常被认为是在列表索引范围内循环的pythonic替代方法。除此之外,你的解决方案没有什么不和谐的地方

for i, v in enumerate(b):
  try:
    a[i][1] = v
  except IndexError:
    a.append([None, v])
或者,使用迭代器避免多个try/catch触发器:

bnumer = enumerate(b)
for i, v in bnumer:
  try:
    a[i][1] = v
  except IndexError:
    break

# extend the list with the remaining default values from b
a.extend([None,v] for v in bnumer)

尝试使用列表理解:

if len(a) > len(b):
    result = [[e[0], b[i]] if i < len(b) else e for i, e in enumerate(a)]
else:
    result = [[a[i][0], e] if i < len(a) else [None, e] for i, e in enumerate(b)]
如果len(a)>len(b):
结果=[[e[0],b[i]]如果i

以上考虑了问题中描述的三个案例,是否更像是肾盂,这取决于您的判断——但它会产生正确的结果,这才是最重要的。

Cute,但是它实际上如何比一个简单的循环更好呢?@kojiro列表理解和没有索引。我们可以讨论pythonic的含义,但我认为这违反了pythonic-m this | cat-n
的第5、9、15和19行。这将帮助我理解为什么您认为您的解决方案是非pythonic的。因为正如我在回答中所说的那样,我不认为这是一个简单的列表理解是一件美好的事情,但稀疏比密集更符合实际。@kojiro
for(I=0;ii喜欢那样(尤其是非优化的第一个解);但是
a[I]=[None,v]
将使用索引器进行解救;
a[I]+=[None,v]]
虽然我最喜欢@hcwhsa对简单情况的回答(两个列表长度相同),但这两种情况下的解决方案似乎都最具可读性。
if len(a) > len(b):
    result = [[e[0], b[i]] if i < len(b) else e for i, e in enumerate(a)]
else:
    result = [[a[i][0], e] if i < len(a) else [None, e] for i, e in enumerate(b)]