我有一个二维列表,如:
[[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]
那样,以便我可以递归地管理我的代码?
答案 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))