Loop from a specific point in a list of lists Python
up vote
1
down vote
favorite
I would like to append to a new list all elements of an existing list of lists after a specific point
m = [[1,2,3],[4,5,10],[6,2,1]]
specific point = m[0][2]
newlist = [3,4,5,10,6,2,1]
python list nested-lists flatten
add a comment |
up vote
1
down vote
favorite
I would like to append to a new list all elements of an existing list of lists after a specific point
m = [[1,2,3],[4,5,10],[6,2,1]]
specific point = m[0][2]
newlist = [3,4,5,10,6,2,1]
python list nested-lists flatten
Are sublists of equal size?
– coldspeed
Nov 11 at 22:29
Yes they are, ex. all length of 2, or all length of 5
– Cheetaiean
Nov 11 at 22:31
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I would like to append to a new list all elements of an existing list of lists after a specific point
m = [[1,2,3],[4,5,10],[6,2,1]]
specific point = m[0][2]
newlist = [3,4,5,10,6,2,1]
python list nested-lists flatten
I would like to append to a new list all elements of an existing list of lists after a specific point
m = [[1,2,3],[4,5,10],[6,2,1]]
specific point = m[0][2]
newlist = [3,4,5,10,6,2,1]
python list nested-lists flatten
python list nested-lists flatten
edited Nov 11 at 23:44
coldspeed
114k18105182
114k18105182
asked Nov 11 at 22:27
Cheetaiean
1041210
1041210
Are sublists of equal size?
– coldspeed
Nov 11 at 22:29
Yes they are, ex. all length of 2, or all length of 5
– Cheetaiean
Nov 11 at 22:31
add a comment |
Are sublists of equal size?
– coldspeed
Nov 11 at 22:29
Yes they are, ex. all length of 2, or all length of 5
– Cheetaiean
Nov 11 at 22:31
Are sublists of equal size?
– coldspeed
Nov 11 at 22:29
Are sublists of equal size?
– coldspeed
Nov 11 at 22:29
Yes they are, ex. all length of 2, or all length of 5
– Cheetaiean
Nov 11 at 22:31
Yes they are, ex. all length of 2, or all length of 5
– Cheetaiean
Nov 11 at 22:31
add a comment |
6 Answers
6
active
oldest
votes
up vote
1
down vote
accepted
You can put a conditional in your iteration and only add based on that condition. Once you hit that specific index, make your condition true. Something like this:
m = [[1,2,3],[4,5,10],[6,2,1]]
specific_point = (0,2)
newlist = [3,4,5,10,6,2,1]
output =
for i in range(len(m)):
for j in range(len(m[i])):
if (i,j) < specific_point:
continue
output.append(m[i][j])
output:
[3, 4, 5, 10, 6, 2, 1]
This seems like the most rudimentary way, thanks. I will double check if it works when I return home
– Cheetaiean
Nov 11 at 22:50
1
You can also roll this into a list-comp, eg:output = [v for y, r in enumerate(m) for x, v in enumerate(r) if (y, x) >= specific_point]
...
– Jon Clements♦
Nov 11 at 22:51
add a comment |
up vote
3
down vote
Here's a couple of functional approaches for efficiently iterating over your data.
If sublists are evenly sized, and you know the index from where to begin extracting elements, use chain
+ islice
:
from itertools import chain, islice
n = 3 # Sublist size.
i,j = 0,2
newlist = list(islice(chain.from_iterable(m), i*n + j, None))
If you don't know the size of your sublists in advance, you can use next
to discard the first portion of your data.
V = chain.from_iterable(m)
next(v for v in V if v == m[i][j])
newlist = list(V)
newlist.insert(m[i][j], 0)
This assumes there is no identical value earlier in the sequence.
These solutions are a bit too advanced, I'm expected to use more basic code. Thank you though
– Cheetaiean
Nov 11 at 22:51
add a comment |
up vote
2
down vote
You can directly slice off the remainder of the first target list and then add on all subsequent elements, eg:
m = [[1,2,3],[4,5,10],[6,2,1]]
y, x = 0, 2
new_list = m[y][x:] + [v for el in m[y+1:] for v in el]
# [3, 4, 5, 10, 6, 2, 1]
add a comment |
up vote
1
down vote
why not flatten the initial list and go from there
flat_list = [item for sublist in m for item in sublist]
would return [1,2,3,4,5,10,6,2,1]
so now you're really on flat_list[2:]
It is in a function in which specific_point serves as an input, i.e. def find_value(m, specific_point)
– Cheetaiean
Nov 11 at 22:36
right but once you flatten the list all you have to do is compute the first index of the slice, based on the specific point
– vencaslac
Nov 11 at 22:41
Just pointing out, this will create a new flattened list, and thenflat_list[:2]
will create yet another list with the sliced elements.
– coldspeed
Nov 11 at 22:43
@vencaslac You're right, but that only works while specific_point[0] is 0. How about if specific point was [2,1] for example.
– Cheetaiean
Nov 11 at 22:43
2xlen(sublist)+1
– vencaslac
Nov 11 at 22:44
add a comment |
up vote
1
down vote
Most of the answers only work for this specific shape of nested list, but it's also possible to create a solution that works with any shape of nested list.
def flatten_from(sequence, path=):
start = path.pop(0) if path else 0
for item in sequence[start:]:
if isinstance(item, (list, tuple)):
yield from flatten_from(item, path)
else:
yield item
With the example from the question
>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]
It also works with any shape and level of nesting of the input data
m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]
flatten_from(m, )) # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2]) # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11
This is a bit of a bastard algorithm, though. On one hand, it uses nice functional programming concepts: recursion and yield.
On the other hand it relies on the side effect of mutating the path argument with list.pop
, so it's not a pure function.
add a comment |
up vote
0
down vote
Below solution will work for your case where your array is restricted to list of list and the size of 'sublist' is consistent throughout i.e "3" in your case
m = [[1,2,3],[4,5,10],[6,2,1]] #input 2D array
a, b = 0, 2 #user input --> specific point a and b
flat_list_m = [item for firstlist in m for item in firstlist] #flat the 2D list
print (flat_list_m[len(m[0])*a+b:]) #print from specific position a and b, considering your sublist length is consistent throughout.
I hope this helps! :)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53253871%2floop-from-a-specific-point-in-a-list-of-lists-python%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
You can put a conditional in your iteration and only add based on that condition. Once you hit that specific index, make your condition true. Something like this:
m = [[1,2,3],[4,5,10],[6,2,1]]
specific_point = (0,2)
newlist = [3,4,5,10,6,2,1]
output =
for i in range(len(m)):
for j in range(len(m[i])):
if (i,j) < specific_point:
continue
output.append(m[i][j])
output:
[3, 4, 5, 10, 6, 2, 1]
This seems like the most rudimentary way, thanks. I will double check if it works when I return home
– Cheetaiean
Nov 11 at 22:50
1
You can also roll this into a list-comp, eg:output = [v for y, r in enumerate(m) for x, v in enumerate(r) if (y, x) >= specific_point]
...
– Jon Clements♦
Nov 11 at 22:51
add a comment |
up vote
1
down vote
accepted
You can put a conditional in your iteration and only add based on that condition. Once you hit that specific index, make your condition true. Something like this:
m = [[1,2,3],[4,5,10],[6,2,1]]
specific_point = (0,2)
newlist = [3,4,5,10,6,2,1]
output =
for i in range(len(m)):
for j in range(len(m[i])):
if (i,j) < specific_point:
continue
output.append(m[i][j])
output:
[3, 4, 5, 10, 6, 2, 1]
This seems like the most rudimentary way, thanks. I will double check if it works when I return home
– Cheetaiean
Nov 11 at 22:50
1
You can also roll this into a list-comp, eg:output = [v for y, r in enumerate(m) for x, v in enumerate(r) if (y, x) >= specific_point]
...
– Jon Clements♦
Nov 11 at 22:51
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
You can put a conditional in your iteration and only add based on that condition. Once you hit that specific index, make your condition true. Something like this:
m = [[1,2,3],[4,5,10],[6,2,1]]
specific_point = (0,2)
newlist = [3,4,5,10,6,2,1]
output =
for i in range(len(m)):
for j in range(len(m[i])):
if (i,j) < specific_point:
continue
output.append(m[i][j])
output:
[3, 4, 5, 10, 6, 2, 1]
You can put a conditional in your iteration and only add based on that condition. Once you hit that specific index, make your condition true. Something like this:
m = [[1,2,3],[4,5,10],[6,2,1]]
specific_point = (0,2)
newlist = [3,4,5,10,6,2,1]
output =
for i in range(len(m)):
for j in range(len(m[i])):
if (i,j) < specific_point:
continue
output.append(m[i][j])
output:
[3, 4, 5, 10, 6, 2, 1]
edited Nov 11 at 22:39
answered Nov 11 at 22:32
LeKhan9
921112
921112
This seems like the most rudimentary way, thanks. I will double check if it works when I return home
– Cheetaiean
Nov 11 at 22:50
1
You can also roll this into a list-comp, eg:output = [v for y, r in enumerate(m) for x, v in enumerate(r) if (y, x) >= specific_point]
...
– Jon Clements♦
Nov 11 at 22:51
add a comment |
This seems like the most rudimentary way, thanks. I will double check if it works when I return home
– Cheetaiean
Nov 11 at 22:50
1
You can also roll this into a list-comp, eg:output = [v for y, r in enumerate(m) for x, v in enumerate(r) if (y, x) >= specific_point]
...
– Jon Clements♦
Nov 11 at 22:51
This seems like the most rudimentary way, thanks. I will double check if it works when I return home
– Cheetaiean
Nov 11 at 22:50
This seems like the most rudimentary way, thanks. I will double check if it works when I return home
– Cheetaiean
Nov 11 at 22:50
1
1
You can also roll this into a list-comp, eg:
output = [v for y, r in enumerate(m) for x, v in enumerate(r) if (y, x) >= specific_point]
...– Jon Clements♦
Nov 11 at 22:51
You can also roll this into a list-comp, eg:
output = [v for y, r in enumerate(m) for x, v in enumerate(r) if (y, x) >= specific_point]
...– Jon Clements♦
Nov 11 at 22:51
add a comment |
up vote
3
down vote
Here's a couple of functional approaches for efficiently iterating over your data.
If sublists are evenly sized, and you know the index from where to begin extracting elements, use chain
+ islice
:
from itertools import chain, islice
n = 3 # Sublist size.
i,j = 0,2
newlist = list(islice(chain.from_iterable(m), i*n + j, None))
If you don't know the size of your sublists in advance, you can use next
to discard the first portion of your data.
V = chain.from_iterable(m)
next(v for v in V if v == m[i][j])
newlist = list(V)
newlist.insert(m[i][j], 0)
This assumes there is no identical value earlier in the sequence.
These solutions are a bit too advanced, I'm expected to use more basic code. Thank you though
– Cheetaiean
Nov 11 at 22:51
add a comment |
up vote
3
down vote
Here's a couple of functional approaches for efficiently iterating over your data.
If sublists are evenly sized, and you know the index from where to begin extracting elements, use chain
+ islice
:
from itertools import chain, islice
n = 3 # Sublist size.
i,j = 0,2
newlist = list(islice(chain.from_iterable(m), i*n + j, None))
If you don't know the size of your sublists in advance, you can use next
to discard the first portion of your data.
V = chain.from_iterable(m)
next(v for v in V if v == m[i][j])
newlist = list(V)
newlist.insert(m[i][j], 0)
This assumes there is no identical value earlier in the sequence.
These solutions are a bit too advanced, I'm expected to use more basic code. Thank you though
– Cheetaiean
Nov 11 at 22:51
add a comment |
up vote
3
down vote
up vote
3
down vote
Here's a couple of functional approaches for efficiently iterating over your data.
If sublists are evenly sized, and you know the index from where to begin extracting elements, use chain
+ islice
:
from itertools import chain, islice
n = 3 # Sublist size.
i,j = 0,2
newlist = list(islice(chain.from_iterable(m), i*n + j, None))
If you don't know the size of your sublists in advance, you can use next
to discard the first portion of your data.
V = chain.from_iterable(m)
next(v for v in V if v == m[i][j])
newlist = list(V)
newlist.insert(m[i][j], 0)
This assumes there is no identical value earlier in the sequence.
Here's a couple of functional approaches for efficiently iterating over your data.
If sublists are evenly sized, and you know the index from where to begin extracting elements, use chain
+ islice
:
from itertools import chain, islice
n = 3 # Sublist size.
i,j = 0,2
newlist = list(islice(chain.from_iterable(m), i*n + j, None))
If you don't know the size of your sublists in advance, you can use next
to discard the first portion of your data.
V = chain.from_iterable(m)
next(v for v in V if v == m[i][j])
newlist = list(V)
newlist.insert(m[i][j], 0)
This assumes there is no identical value earlier in the sequence.
edited Nov 11 at 23:46
answered Nov 11 at 22:36
coldspeed
114k18105182
114k18105182
These solutions are a bit too advanced, I'm expected to use more basic code. Thank you though
– Cheetaiean
Nov 11 at 22:51
add a comment |
These solutions are a bit too advanced, I'm expected to use more basic code. Thank you though
– Cheetaiean
Nov 11 at 22:51
These solutions are a bit too advanced, I'm expected to use more basic code. Thank you though
– Cheetaiean
Nov 11 at 22:51
These solutions are a bit too advanced, I'm expected to use more basic code. Thank you though
– Cheetaiean
Nov 11 at 22:51
add a comment |
up vote
2
down vote
You can directly slice off the remainder of the first target list and then add on all subsequent elements, eg:
m = [[1,2,3],[4,5,10],[6,2,1]]
y, x = 0, 2
new_list = m[y][x:] + [v for el in m[y+1:] for v in el]
# [3, 4, 5, 10, 6, 2, 1]
add a comment |
up vote
2
down vote
You can directly slice off the remainder of the first target list and then add on all subsequent elements, eg:
m = [[1,2,3],[4,5,10],[6,2,1]]
y, x = 0, 2
new_list = m[y][x:] + [v for el in m[y+1:] for v in el]
# [3, 4, 5, 10, 6, 2, 1]
add a comment |
up vote
2
down vote
up vote
2
down vote
You can directly slice off the remainder of the first target list and then add on all subsequent elements, eg:
m = [[1,2,3],[4,5,10],[6,2,1]]
y, x = 0, 2
new_list = m[y][x:] + [v for el in m[y+1:] for v in el]
# [3, 4, 5, 10, 6, 2, 1]
You can directly slice off the remainder of the first target list and then add on all subsequent elements, eg:
m = [[1,2,3],[4,5,10],[6,2,1]]
y, x = 0, 2
new_list = m[y][x:] + [v for el in m[y+1:] for v in el]
# [3, 4, 5, 10, 6, 2, 1]
answered Nov 11 at 22:46
Jon Clements♦
97.8k19173217
97.8k19173217
add a comment |
add a comment |
up vote
1
down vote
why not flatten the initial list and go from there
flat_list = [item for sublist in m for item in sublist]
would return [1,2,3,4,5,10,6,2,1]
so now you're really on flat_list[2:]
It is in a function in which specific_point serves as an input, i.e. def find_value(m, specific_point)
– Cheetaiean
Nov 11 at 22:36
right but once you flatten the list all you have to do is compute the first index of the slice, based on the specific point
– vencaslac
Nov 11 at 22:41
Just pointing out, this will create a new flattened list, and thenflat_list[:2]
will create yet another list with the sliced elements.
– coldspeed
Nov 11 at 22:43
@vencaslac You're right, but that only works while specific_point[0] is 0. How about if specific point was [2,1] for example.
– Cheetaiean
Nov 11 at 22:43
2xlen(sublist)+1
– vencaslac
Nov 11 at 22:44
add a comment |
up vote
1
down vote
why not flatten the initial list and go from there
flat_list = [item for sublist in m for item in sublist]
would return [1,2,3,4,5,10,6,2,1]
so now you're really on flat_list[2:]
It is in a function in which specific_point serves as an input, i.e. def find_value(m, specific_point)
– Cheetaiean
Nov 11 at 22:36
right but once you flatten the list all you have to do is compute the first index of the slice, based on the specific point
– vencaslac
Nov 11 at 22:41
Just pointing out, this will create a new flattened list, and thenflat_list[:2]
will create yet another list with the sliced elements.
– coldspeed
Nov 11 at 22:43
@vencaslac You're right, but that only works while specific_point[0] is 0. How about if specific point was [2,1] for example.
– Cheetaiean
Nov 11 at 22:43
2xlen(sublist)+1
– vencaslac
Nov 11 at 22:44
add a comment |
up vote
1
down vote
up vote
1
down vote
why not flatten the initial list and go from there
flat_list = [item for sublist in m for item in sublist]
would return [1,2,3,4,5,10,6,2,1]
so now you're really on flat_list[2:]
why not flatten the initial list and go from there
flat_list = [item for sublist in m for item in sublist]
would return [1,2,3,4,5,10,6,2,1]
so now you're really on flat_list[2:]
answered Nov 11 at 22:33
vencaslac
1,002217
1,002217
It is in a function in which specific_point serves as an input, i.e. def find_value(m, specific_point)
– Cheetaiean
Nov 11 at 22:36
right but once you flatten the list all you have to do is compute the first index of the slice, based on the specific point
– vencaslac
Nov 11 at 22:41
Just pointing out, this will create a new flattened list, and thenflat_list[:2]
will create yet another list with the sliced elements.
– coldspeed
Nov 11 at 22:43
@vencaslac You're right, but that only works while specific_point[0] is 0. How about if specific point was [2,1] for example.
– Cheetaiean
Nov 11 at 22:43
2xlen(sublist)+1
– vencaslac
Nov 11 at 22:44
add a comment |
It is in a function in which specific_point serves as an input, i.e. def find_value(m, specific_point)
– Cheetaiean
Nov 11 at 22:36
right but once you flatten the list all you have to do is compute the first index of the slice, based on the specific point
– vencaslac
Nov 11 at 22:41
Just pointing out, this will create a new flattened list, and thenflat_list[:2]
will create yet another list with the sliced elements.
– coldspeed
Nov 11 at 22:43
@vencaslac You're right, but that only works while specific_point[0] is 0. How about if specific point was [2,1] for example.
– Cheetaiean
Nov 11 at 22:43
2xlen(sublist)+1
– vencaslac
Nov 11 at 22:44
It is in a function in which specific_point serves as an input, i.e. def find_value(m, specific_point)
– Cheetaiean
Nov 11 at 22:36
It is in a function in which specific_point serves as an input, i.e. def find_value(m, specific_point)
– Cheetaiean
Nov 11 at 22:36
right but once you flatten the list all you have to do is compute the first index of the slice, based on the specific point
– vencaslac
Nov 11 at 22:41
right but once you flatten the list all you have to do is compute the first index of the slice, based on the specific point
– vencaslac
Nov 11 at 22:41
Just pointing out, this will create a new flattened list, and then
flat_list[:2]
will create yet another list with the sliced elements.– coldspeed
Nov 11 at 22:43
Just pointing out, this will create a new flattened list, and then
flat_list[:2]
will create yet another list with the sliced elements.– coldspeed
Nov 11 at 22:43
@vencaslac You're right, but that only works while specific_point[0] is 0. How about if specific point was [2,1] for example.
– Cheetaiean
Nov 11 at 22:43
@vencaslac You're right, but that only works while specific_point[0] is 0. How about if specific point was [2,1] for example.
– Cheetaiean
Nov 11 at 22:43
2xlen(sublist)+1
– vencaslac
Nov 11 at 22:44
2xlen(sublist)+1
– vencaslac
Nov 11 at 22:44
add a comment |
up vote
1
down vote
Most of the answers only work for this specific shape of nested list, but it's also possible to create a solution that works with any shape of nested list.
def flatten_from(sequence, path=):
start = path.pop(0) if path else 0
for item in sequence[start:]:
if isinstance(item, (list, tuple)):
yield from flatten_from(item, path)
else:
yield item
With the example from the question
>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]
It also works with any shape and level of nesting of the input data
m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]
flatten_from(m, )) # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2]) # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11
This is a bit of a bastard algorithm, though. On one hand, it uses nice functional programming concepts: recursion and yield.
On the other hand it relies on the side effect of mutating the path argument with list.pop
, so it's not a pure function.
add a comment |
up vote
1
down vote
Most of the answers only work for this specific shape of nested list, but it's also possible to create a solution that works with any shape of nested list.
def flatten_from(sequence, path=):
start = path.pop(0) if path else 0
for item in sequence[start:]:
if isinstance(item, (list, tuple)):
yield from flatten_from(item, path)
else:
yield item
With the example from the question
>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]
It also works with any shape and level of nesting of the input data
m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]
flatten_from(m, )) # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2]) # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11
This is a bit of a bastard algorithm, though. On one hand, it uses nice functional programming concepts: recursion and yield.
On the other hand it relies on the side effect of mutating the path argument with list.pop
, so it's not a pure function.
add a comment |
up vote
1
down vote
up vote
1
down vote
Most of the answers only work for this specific shape of nested list, but it's also possible to create a solution that works with any shape of nested list.
def flatten_from(sequence, path=):
start = path.pop(0) if path else 0
for item in sequence[start:]:
if isinstance(item, (list, tuple)):
yield from flatten_from(item, path)
else:
yield item
With the example from the question
>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]
It also works with any shape and level of nesting of the input data
m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]
flatten_from(m, )) # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2]) # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11
This is a bit of a bastard algorithm, though. On one hand, it uses nice functional programming concepts: recursion and yield.
On the other hand it relies on the side effect of mutating the path argument with list.pop
, so it's not a pure function.
Most of the answers only work for this specific shape of nested list, but it's also possible to create a solution that works with any shape of nested list.
def flatten_from(sequence, path=):
start = path.pop(0) if path else 0
for item in sequence[start:]:
if isinstance(item, (list, tuple)):
yield from flatten_from(item, path)
else:
yield item
With the example from the question
>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]
It also works with any shape and level of nesting of the input data
m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]
flatten_from(m, )) # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2]) # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11
This is a bit of a bastard algorithm, though. On one hand, it uses nice functional programming concepts: recursion and yield.
On the other hand it relies on the side effect of mutating the path argument with list.pop
, so it's not a pure function.
edited Nov 11 at 23:52
answered Nov 11 at 23:24
Håken Lid
10.5k62441
10.5k62441
add a comment |
add a comment |
up vote
0
down vote
Below solution will work for your case where your array is restricted to list of list and the size of 'sublist' is consistent throughout i.e "3" in your case
m = [[1,2,3],[4,5,10],[6,2,1]] #input 2D array
a, b = 0, 2 #user input --> specific point a and b
flat_list_m = [item for firstlist in m for item in firstlist] #flat the 2D list
print (flat_list_m[len(m[0])*a+b:]) #print from specific position a and b, considering your sublist length is consistent throughout.
I hope this helps! :)
add a comment |
up vote
0
down vote
Below solution will work for your case where your array is restricted to list of list and the size of 'sublist' is consistent throughout i.e "3" in your case
m = [[1,2,3],[4,5,10],[6,2,1]] #input 2D array
a, b = 0, 2 #user input --> specific point a and b
flat_list_m = [item for firstlist in m for item in firstlist] #flat the 2D list
print (flat_list_m[len(m[0])*a+b:]) #print from specific position a and b, considering your sublist length is consistent throughout.
I hope this helps! :)
add a comment |
up vote
0
down vote
up vote
0
down vote
Below solution will work for your case where your array is restricted to list of list and the size of 'sublist' is consistent throughout i.e "3" in your case
m = [[1,2,3],[4,5,10],[6,2,1]] #input 2D array
a, b = 0, 2 #user input --> specific point a and b
flat_list_m = [item for firstlist in m for item in firstlist] #flat the 2D list
print (flat_list_m[len(m[0])*a+b:]) #print from specific position a and b, considering your sublist length is consistent throughout.
I hope this helps! :)
Below solution will work for your case where your array is restricted to list of list and the size of 'sublist' is consistent throughout i.e "3" in your case
m = [[1,2,3],[4,5,10],[6,2,1]] #input 2D array
a, b = 0, 2 #user input --> specific point a and b
flat_list_m = [item for firstlist in m for item in firstlist] #flat the 2D list
print (flat_list_m[len(m[0])*a+b:]) #print from specific position a and b, considering your sublist length is consistent throughout.
I hope this helps! :)
answered Nov 12 at 6:18
Akash Swain
813
813
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53253871%2floop-from-a-specific-point-in-a-list-of-lists-python%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Are sublists of equal size?
– coldspeed
Nov 11 at 22:29
Yes they are, ex. all length of 2, or all length of 5
– Cheetaiean
Nov 11 at 22:31