未知项穷举

ImN1 2013-05-05 01:43:27
写一个python的function(*arg) 注意是不定传入

要求
function([1,2], [3,4]) 返回[[1,3], [1,4], [2,3], [2,4]]
function([1,2], [3,4], [5,6]) 返回[[1,3,5], [1,3,6], [1,4,5], [1,4,6], [2,3,5], [2,3,6], [2,4,5], [2,4,6]]
……
就是穷举了

不需考虑容错,假定输入的都是有效整数列表,但列表个数不定,列表内数目也不定
------------------------------
让小天使骗了200分,itertools.product(*iterables, repeat=1) 不适合
------------------------------
研究两小时,自写了一个,谁有更好的算法?越简单越好

def zMakeTable(*args):
m = [[x] for x in args[0]]
for i, v in enumerate(args[1:]):
tmp = []
for x in m:
for y in v:
x.append(y)
tmp.append([n for n in x])
del x[-1:]
m = [z for z in tmp]
return m

if __name__ == '__main__':
print(zMakeTable([1, 2], [3, 4], [5, 6], [7, 8]))
# [[1, 3, 5, 7], [1, 3, 5, 8], [1, 3, 6, 7], [1, 3, 6, 8],
# [1, 4, 5, 7], [1, 4, 5, 8], [1, 4, 6, 7], [1, 4, 6, 8],
# [2, 3, 5, 7], [2, 3, 5, 8], [2, 3, 6, 7], [2, 3, 6, 8],
# [2, 4, 5, 7], [2, 4, 5, 8], [2, 4, 6, 7], [2, 4, 6, 8]]
...全文
141 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bugs2k 2013-05-05
  • 打赏
  • 举报
回复
看来还是 itertools 简洁
ChongQingJin28 2013-05-05
  • 打赏
  • 举报
回复
#用动态函数的方法可以吗?(python可是动态的语言)
def~f(*arg):
~~~~s=~"def~ff():\n"~;~~~~space~=~1~~~;~~ye~=~""
~~~~for~item~in~arg:
~~~~~~~~s+="~~~~"*space+"for~i"+str(space)+"~in~"+str(arg[space-1])+":\n"
~~~~~~~~ye~=~ye+"i"+str(space)+","~;space~+=1
~~~~s+="~~~~"*space+"yield(("+ye+"))"~~~#;print(s)
~~~~return~s

#这个有用吗?(打开一个文件?)
exec(f([1,2,7,8],[3,4,9,0],'"asdf"','open("z.txt","r")'))
print(list(ff()))

#如果不用动态函数,他应该是一个进制可变的数
#个位3进制,十位5进制,百位2进制(举例而已)。
#(这样好像有点麻烦了,就不弄了吧)

ImN1 2013-05-05
  • 打赏
  • 举报
回复
改为散分贴……
ImN1 2013-05-05
  • 打赏
  • 举报
回复
真是见鬼了,写的我头晕 刚才一直在 idle 测试 product 返回的是[[[1,3],5],7]……的形式,现在又好了,我的参数传入有误?
panghuhu250 2013-05-05
  • 打赏
  • 举报
回复
itertools.product为什么不合适?

In [44]: from itertools import product

In [45]: def f(*arg):
    ...:     return product(*arg)

In [46]: product('ab', 'cd', 'efg')
Out[46]: <itertools.product at 0x3529190>

In [47]: list(_)
Out[47]: 
[('a', 'c', 'e'),
 ('a', 'c', 'f'),
 ('a', 'c', 'g'),
 ('a', 'd', 'e'),
 ('a', 'd', 'f'),
 ('a', 'd', 'g'),
 ('b', 'c', 'e'),
 ('b', 'c', 'f'),
 ('b', 'c', 'g'),
 ('b', 'd', 'e'),
 ('b', 'd', 'f'),
 ('b', 'd', 'g')]

In [48]: list(f('ab', 'cd'))
Out[48]: [('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')]

In [49]: list(f('ab', 'cd', 'efg'))
Out[49]: 
[('a', 'c', 'e'),
 ('a', 'c', 'f'),
 ('a', 'c', 'g'),
 ('a', 'd', 'e'),
 ('a', 'd', 'f'),
 ('a', 'd', 'g'),
 ('b', 'c', 'e'),
 ('b', 'c', 'f'),
 ('b', 'c', 'g'),
 ('b', 'd', 'e'),
 ('b', 'd', 'f'),
 ('b', 'd', 'g')]
这个是自己写的:

In [50]: def myProduct(*arg):
    ...:     if len(arg) == 0:
    ...:         yield []
    ...:     else:
    ...:         for prefix in myProduct(*arg[:-1]):
    ...:             for item in arg[-1]:
    ...:                 yield prefix + [item]
    ...:                 

In [51]: list(myProduct('ab'))
Out[51]: [['a'], ['b']]

In [52]: list(myProduct('ab', 'cd', 'e'))
Out[52]: [['a', 'c', 'e'], ['a', 'd', 'e'], ['b', 'c', 'e'], ['b', 'd', 'e']]
ImN1 2013-05-05
  • 打赏
  • 举报
回复
引用 2 楼 angel_su 的回复:
itertools.product不合适的问题是?
你试一下我上面给的[1, 2], [3, 4], [5, 6], [7, 8] 或更多……
angel_su 2013-05-05
  • 打赏
  • 举报
回复
itertools.product不合适的问题是?
maniachhz 2013-05-05
  • 打赏
  • 举报
回复
唉,我现在基本功能还不会用,更别想那些算法了.....

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧