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

6 views
Skip to first unread message

Hanfei

unread,
Feb 9, 2009, 4:39:25 AM2/9/09
to 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)

金浩

unread,
Feb 9, 2009, 4:55:38 AM2/9/09
to pyth...@googlegroups.com
元素很多的话,用 yield 的话比较节省内存吧。

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

july

unread,
Feb 9, 2009, 5:05:38 AM2/9/09
to python-cn`CPyUG`华蟒用户组
采用平民二进制发,suppose a list[a,b,c,d] and a binary number 0000 to 1111,
用数字来代替各种情况,这样一个循环搞定。

Hanfei

unread,
Feb 9, 2009, 5:19:07 AM2/9/09
to python-cn`CPyUG`华蟒用户组
点子不错!

He Jibo

unread,
Feb 9, 2009, 9:59:46 AM2/9/09
to 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

unread,
Feb 9, 2009, 10:07:20 AM2/9/09
to 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

unread,
Feb 9, 2009, 10:40:00 PM2/9/09
to 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

unread,
Feb 9, 2009, 11:49:56 PM2/9/09
to python-cn`CPyUG`华蟒用户组
不错不错,这个是不是最快的了?

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

keep.studyi...@gmail.com

unread,
Feb 10, 2009, 1:52:03 AM2/10/09
to python-cn`CPyUG`华蟒用户组
第九行是不是应该这样:

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

Liu Qishuai

unread,
Feb 10, 2009, 1:56:53 AM2/10/09
to pyth...@googlegroups.com
或者第七行这样:

for bo in range(len(list)):


Hanfei

unread,
Feb 10, 2009, 4:10:03 AM2/10/09
to python-cn`CPyUG`华蟒用户组
>2**len(list)
表达二进制真爽!
Reply all
Reply to author
Forward
0 new messages