在2D list python中动态插入值

时间:2014-03-14 17:14:22

标签: python

我有一个二维列表,如:

[[1, 1, 0, 0], [1, 0, 1, 0], [0, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [0, 1, 1, 0], [1, 1, 1, 1]]

我希望彼此对内部子列表进行异或。所以在某些时间点我会得到一个包含[0,0,0,0]全零的子列表,如果我没有得到两个子列表,我必须去三个子列表的XORing直到我再次[0,0,0,0],如果没有,则必须选择四个子列表。

问题是我可以做的就像拿起两个列表和XOR每个元素然后将它保存在单独的子列表中,这可以工作,但每次我必须更改我的代码所以有任何方法可以像X一样的XOR子列表{1}}而不是像[1, 1, 0, 0] ^ [1, 0, 1, 0]那样,以便我可以递归地管理我的代码?

2 个答案:

答案 0 :(得分:0)

您可以做的是将 2-D位列表转换为 1-D数字列表,然后将XOR个列表一起转换。

a = [[1, 1, 0, 0], [1, 0, 1, 0], [0, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [0, 1, 1, 0], [1, 1, 1, 1]]
b = map(lambda x: int("".join(map(lambda y: str(y), x)),2), a)


b is now: [12, 10, 6, 14, 14, 6, 15]

现在您正在使用 1-D 列表,这样可以更轻松。

答案 1 :(得分:0)

你可以找到更短但我觉得这样可行:

STOP=[0,0,0,0]

def nxor(l,res=None,p=1):
    if not res: res= l[0]
    if res == STOP:
        return p-1 # or l[:p]
    try:
        return nxor(l,list(iter.imap (operator.xor, *list([res,l[p]]) )),p+1)
    except:
        return None # or res 

print nxor (l)

返回导致[0,0,0,0]的最后一个子列表的位置;很容易返回子列表,或实际结果(见注释)。

如果要测试所有组合,可以使用itertools:

for i in xrange(2,len(l)):
    for j in itertools.combinations(l,i):
        print nxor(list(j))