Hi,
is there an efficient (pythonic) way in which I could split a list into
say 5 groups? By split I mean the the first x members would be one group,
the next x members another group and so on 5 times. (Obviously x =
lengthof list/5)
I have done this by a simple for loop and using indexes into the list.
But it does'nt seemm very elegant
Thanks, 13 6805
Rajarshi Guha wrote: Hi, is there an efficient (pythonic) way in which I could split a list into say 5 groups? By split I mean the the first x members would be one group, the next x members another group and so on 5 times. (Obviously x = lengthof list/5)
I have done this by a simple for loop and using indexes into the list. But it does'nt seemm very elegant
Depending on what you're doing, this may or may not be appropriate, but
you might want to look at Numeric (or it's eventual successor numarray).
In this case, you could use reshape to map your list into a n by x
array, which you can treat like a nested list with respect to indexing. import Numeric data = range(25) split = Numeric.reshape (data, (5,5)) split
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]]) split[0]
array([0, 1, 2, 3, 4]) list(split[4])
[20, 21, 22, 23, 24]
You can sometimes use Numeric with nonnumeric data, but it tends to be
quircky and often is not worth the trouble, but if you've got numeric
data, try it out.
-tim
Rajarshi Guha <ra******@presi dency.com> writes: Hi, is there an efficient (pythonic) way in which I could split a list into say 5 groups? By split I mean the the first x members would be one group, the next x members another group and so on 5 times. (Obviously x = lengthof list/5)
How about :
------------------------------------------------------------
def span (x, n):
return range(0, x, n)
def group (l, num):
n = (len(l)/num) + 1
return [l[s:s+n] for s in span (len(l), n)]
# test cases
l1 = range(100)
print group (l1, 5)
print group (l1, 6)
print group (l1, 4)
------------------------------------------------------------
Even though span could be folded in to make it shorter, abstracting it out
allows you to name and document what it does (return the start index of each
SPAN of n items). Also it doesn't worry too much about the last list being
the same size as the rest. I'm too lazy to check the boundary conditions
properly (an exercise for the reader). A completely non lazy person would
possibly define the more primitive group_by_n:
def group_by_n (l, n):
return [l[s:s+n] for s in span (len(l), n)]
and define group_into_num_ pieces in terms of that:
def group_into_num_ pieces (l, num):
return group_by_n (l,(len(l)/num) + 1)
giving you 3 useful functions for the price of 1, but I'm too lazy for that.
Eddie
"Rajarshi Guha" <ra******@presi dency.com> wrote in message
news:pa******** *************** ***********@pre sidency.com... Hi, is there an efficient (pythonic) way in which I could split a list
into say 5 groups? By split I mean the the first x members would be one
group, the next x members another group and so on 5 times. (Obviously x = lengthof list/5)
I have done this by a simple for loop and using indexes into the
list. But it does'nt seemm very elegant
Does it work correctly for all input cases? Is it readable? Is it
acceptibly fast? If so, it is probably 'Pythonic' enough.
TJR
Rajarshi Guha <ra******@presi dency.com> writes: is there an efficient (pythonic) way in which I could split a list into say 5 groups? By split I mean the the first x members would be one group, the next x members another group and so on 5 times. (Obviously x = lengthof list/5)
groups = [a[i:i+(len(a)//5)] for i in range(5)]
Paul Rubin wrote: Rajarshi Guha <ra******@presi dency.com> writes: is there an efficient (pythonic) way in which I could split a list into say 5 groups? By split I mean the the first x members would be one group, the next x members another group and so on 5 times. (Obviously x = lengthof list/5)
groups = [a[i:i+(len(a)//5)] for i in range(5)] for k in range(10):
.... a = range(k)
.... print [a[i:i+(len(a)//5)] for i in range(5)]
....
[[], [], [], [], []]
[[], [], [], [], []]
[[], [], [], [], []]
[[], [], [], [], []]
[[], [], [], [], []]
[[0], [1], [2], [3], [4]]
[[0], [1], [2], [3], [4]]
[[0], [1], [2], [3], [4]]
[[0], [1], [2], [3], [4]]
[[0], [1], [2], [3], [4]]
Is that what you expected?
Peter
Eddie Corns wrote: Rajarshi Guha <ra******@presi dency.com> writes:
Hi, is there an efficient (pythonic) way in which I could split a list into say 5 groups? By split I mean the the first x members would be one group, the next x members another group and so on 5 times. (Obviously x = lengthof list/5)
How about:
------------------------------------------------------------ def span (x, n): return range(0, x, n)
def group (l, num): n = (len(l)/num) + 1 return [l[s:s+n] for s in span (len(l), n)]
# test cases l1 = range(100) print group (l1, 5) print group (l1, 6) print group (l1, 4) ------------------------------------------------------------
More test cases :-)
for k in range(20):
l1 = range(k)
lol = group(l1, 5)
print len(lol), lol
0 []
1 [[0]]
2 [[0], [1]]
3 [[0], [1], [2]]
4 [[0], [1], [2], [3]]
3 [[0, 1], [2, 3], [4]]
3 [[0, 1], [2, 3], [4, 5]]
4 [[0, 1], [2, 3], [4, 5], [6]]
4 [[0, 1], [2, 3], [4, 5], [6, 7]]
5 [[0, 1], [2, 3], [4, 5], [6, 7], [8]]
4 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
4 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
4 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12]]
5 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]]
4 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14]]
4 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16]]
5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17]]
5 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17,
18]]
Peter
Peter Otten <__*******@web. de> writes: groups = [a[i:i+(len(a)//5)] for i in range(5)]
for k in range(10):
... a = range(k) ... print [a[i:i+(len(a)//5)] for i in range(5)] ... [[], [], [], [], []]
.... Is that what you expected?
Bah! Nope, got confused and mis-wrote the loop contents (started
thinking of donig it one way, then another, then got the two mixed up
while typing). Also, wasn't concerned about the case where the list
can't be chopped into equal length parts. Try this:
assert len(a) > 0 and len(a) % 5 == 0
d = len(a) // 5
groups = [a[d*i:d*(i+1)] for i in range(5)]
Handling the case where the pieces end up unequal because len(a) isn't
a multiple of 5 gets a little messy:
d = (len(a) + 4) // 5
groups = [a[d*i:d*(i+1)] for i in range(5)]
when a = range(6) gives
[[0, 1], [2, 3], [4, 5], [], []]
It's not clear to me whether that's good or bad: something like
[[0, 1], [2], [3], [4], [5]]
is probably better, but that would depend on the application.
| ....
| More test cases
| ....
Peter ....
I use Outlook Express with the Quote-Fix add on
for reading news groups and got quite a chuckle
when I saw how your test-case code showed up here .... http://fastq.com/~sckitching/Python/python_lol.png
[ 2 KB ]
--
Cousin Stanley
Human Being
Phoenix, Arizona
Rajarshi Guha <ra******@presi dency.com> wrote in message news:<pa******* *************** ************@pr esidency.com>.. . Hi, is there an efficient (pythonic) way in which I could split a list into say 5 groups? By split I mean the the first x members would be one group, the next x members another group and so on 5 times. (Obviously x = lengthof list/5)
I have done this by a simple for loop and using indexes into the list. But it does'nt seemm very elegant
Thanks,
I had the same problem a while back. Here's the function I wrote:
def GroupList(inlis t, step=2):
outlist = []
ents = len(inlist)
if ents % step != 0:
print "In GroupList, the length of list ", inlist, " isn't
evenly"
print "divisible by step %i" % step
sys.exit(4)
maininds = filter(lambda x: x % step == 0, range(ents))
for i in maininds:
currlist = []
for j in range(step):
currlist.append (inlist[i+j])
outlist.append( currlist)
return outlist
As you can see, I made some assumptions (the default n is 2, the list
must be evenly divisible by the step, and so on) and I haven't heavily
debugged it, but it might help you out. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: robsom |
last post by:
Hi, I have a problem with a small python program I'm trying to write
and I hope somebody may help me. I'm working on tables of this kind:
CGA 1988 06 21 13 48 G500-050 D 509.62 J.. R1 1993 01 28 00 00 880006
CGA 1988 06 21 14 04 G500-051 D 550.62 J.. R1 1993 01 28 00 00 880007
I have to read each line of the table and put it into comma-separated
lists like these for later manipulation:
...
|
by: Piet |
last post by:
Hello,
I have a very strange problem with regular expressions. The problem
consists of analyzing the properties of columns of a MySQL database.
When I request the column type, I get back a string with the following
composition:
vartype(width|list) further variable attributes.
vartype is a simple string(varchar, tinyint ...) which might be
followed by a string in curved brackets. This bracketed string is
either composed of a single...
|
by: lemon97 |
last post by:
Hi,
Is there a function that split a string into groups, containing an "x"
amount of characters?
Ex.
TheFunction("Hello World",3)
Returns:
|
by: Gustav |
last post by:
Hi!
I use a regex (?<!\\?)('|\\+|:) to split a string to a String.
The String i get after splitting is correctly splitted but contains all
the delimiters i use to decide where the string should be splitted.
Do I have to loop through the array and find every index containing a single
delimiter or is there a easier way to do this.
|
by: Materialised |
last post by:
Hi all,
Just wondering if someone could help me with this little problem I'm having.
I have a string value (it actually represents a barcode) which looks
like this:
5021378002392
What I wish to do is split this string in 4 different string values, as
| |
by: Simon |
last post by:
Well, the title's pretty descriptive; how would I be able to take a
line of input like this:
getline(cin,mostrecentline);
And split into an (flexible) array of strings. For example: "do this
action"
would go to:
item 0: do
|
by: Qiangning Hong |
last post by:
I've got some strings to split. They are main words, but some words
are inside a pair of brackets and should be considered as one unit. I
prefer to use re.split, but haven't written a working one after hours
of work.
Example:
"a (b c) d h i"
should be splitted to
", "h", "i"]
|
by: Matik |
last post by:
Hi to everyone,
My problem is, that I'm not so quite sure, which way should I go.
The user is inputing by second part application a long string (let's
say 128 characters), which are separated by semiclon.
Example:
A20;BU;AC40;MA50;E;E;IC;GREEN
|
by: nagar |
last post by:
I need to split a string whenever a separator string is present (lets
sey #Key(val) where val is a variable) and rejoin it in the proper
order after doing some processing.
Is there a way to use the Regex.Split function to split the string
whenever the #Key(val) occurrs but that keeps the #Key(val)
occurrences to that I can reconstruct the final string after doing
certain operations on each token (I need to basically convert each
string...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
| |
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |