如何快速产生列表元素的所有组合

已查看 6 次
跳至第一个未读帖子

Hanfei

未读,
2009年2月9日 04:39:252009/2/9
收件人 python-cn`CPyUG`华蟒用户组
对于每个组合,各元素出现的次数可以为0 或1

例如对于 l=[a,b,c,d], 则产生,
a, b, c, d, (a,b), (a,c), ... , (b,c,d),(a,b,c,d)

金浩

未读,
2009年2月9日 04:55:382009/2/9
收件人 pyth...@googlegroups.com
元素很多的话,用 yield 的话比较节省内存吧。

2009/2/9 Hanfei <xuh...@gmail.com>

july

未读,
2009年2月9日 05:05:382009/2/9
收件人 python-cn`CPyUG`华蟒用户组
采用平民二进制发,suppose a list[a,b,c,d] and a binary number 0000 to 1111,
用数字来代替各种情况,这样一个循环搞定。

Hanfei

未读,
2009年2月9日 05:19:072009/2/9
收件人 python-cn`CPyUG`华蟒用户组
点子不错!

He Jibo

未读,
2009年2月9日 09:59:462009/2/9
收件人 pyth...@googlegroups.com
这样应该写呀?
He Jibo
hej...@gmail.com
jib...@cyrus.psych.uiuc.edu


---------------------------
He Jibo
Department of Psychology,
Beckman Institute for Advanced Science and Technology
University of Illinois, Urbana Champaign,
603 East Daniel St.,
Champaign, IL 61820
Tel: 217-244-4461(office)
217-244-6763(lab)
Email: hej...@gmail.com
Charles M. Schulz  - "I love mankind; it's people I can't stand."

2009/2/9 july <julyz...@gmail.com>

Leo Jay

未读,
2009年2月9日 10:07:202009/2/9
收件人 pyth...@googlegroups.com
2009/2/9 Hanfei <xuh...@gmail.com>:

> 对于每个组合,各元素出现的次数可以为0 或1
>
> 例如对于 l=[a,b,c,d], 则产生,
> a, b, c, d, (a,b), (a,c), ... , (b,c,d),(a,b,c,d)
>

这样行不:
def perm(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
for p in perm(items[i+1:], n-1):
yield v + p

def all_perm(items):
result = []
for i in xrange(len(items)):
result += perm(items, i+1)
return result


print all_perm([1,2,3])

运行的结果是:[[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]


--
Best Regards,
Leo Jay

testisok

未读,
2009年2月9日 22:40:002009/2/9
收件人 python-cn`CPyUG`华蟒用户组
好主意,实现一下:
1 #!/usr/bin/env python
2
3 def com(list):
4 com_list = []
5 for i in range(0, 2**len(list)):
6 temp_com = []
7 for bo in range(len(list)-1, 0-1, -1):
8 if i & (1 << bo):
9 temp_com.append(list[bo])
10 com_list.append(temp_com)
11 return com_list
12
13 name_list = ['e1', 'e2', 'e3']
14 com_list = com(name_list)
15 for com in com_list:
16 print com

[]
['e1']
['e2']
['e2', 'e1']
['e3']
['e3', 'e1']
['e3', 'e2']
['e3', 'e2', 'e1']
> > a, b, c, d, (a,b), (a,c), ... , (b,c,d),(a,b,c,d)- 隐藏被引用文字 -
>
> - 显示引用的文字 -

asung0108

未读,
2009年2月9日 23:49:562009/2/9
收件人 python-cn`CPyUG`华蟒用户组
不错不错,这个是不是最快的了?

On 2月9日, 下午6时05分, july <julyzerg...@gmail.com> wrote:

keep.studyi...@gmail.com

未读,
2009年2月10日 01:52:032009/2/10
收件人 python-cn`CPyUG`华蟒用户组
第九行是不是应该这样:

temp_com.append(list[len(list)-1-bo])

Liu Qishuai

未读,
2009年2月10日 01:56:532009/2/10
收件人 pyth...@googlegroups.com
或者第七行这样:

for bo in range(len(list)):


Hanfei

未读,
2009年2月10日 04:10:032009/2/10
收件人 python-cn`CPyUG`华蟒用户组
>2**len(list)
表达二进制真爽!
回复全部
回复作者
转发
0 个新帖子