Concatenate string list to number list to form title - Logic needed.

R

Ravi Prabakaran

Hi,
I'm completely new to python. I just need simple logic to get output without any loops.
I have list of string and list of list of numbers.
Each string should be concatenated with every third and fourth values to generate proper titles in list of strings.

t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]


Expected Result : ( list of strings )

['Start - 3 , End - 4',
'Start - 7 , End - 8']

Note : First 2 values from each list should be ignored.


Could anyone please guide me with best solution without loops ?

Thanks
Ravi
 
C

Chris Angelico

Could anyone please guide me with best solution without loops ?

Why "without loops"? The best solution, in my opinion, is a loop. Is
this a specific challenge (homework)? I could make you a list
comprehension, but that's really just another form of loop

More information on the problem parameters, please?

ChrisA
 
M

Mark Lawrence

Hi,
I'm completely new to python. I just need simple logic to get output without any loops.
I have list of string and list of list of numbers.
Each string should be concatenated with every third and fourth values to generate proper titles in list of strings.

t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]

Expected Result : ( list of strings )

['Start - 3 , End - 4',
'Start - 7 , End - 8']

Note : First 2 values from each list should be ignored.

Could anyone please guide me with best solution without loops ?

Thanks
Ravi

I've no idea what your definition of "best" is but this works.

strings = ['{} - {} , {} - {}'.format(t[0], b[-2], t[1], b[-1]) for b in a]
 
C

Chris Angelico

Thanks for reply. If you have any good idea with loop, please post. But
i'm looking same without loop because python has slicing,concatenating and
other straight forward feature. I guess it can be done without loop. My
client does not prefer loops and expects simple and neat code to improve
performance. We are dealing with billion data.

I'm going to hope that it was in error that you sent this off-list, or
at least that you won't mind my replying on-list. Here's one way to do
it:

t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]
result = []
for cur in a:
result.append("%s - %d"%(t[0],cur[2]))
result.append("%s - %d"%(t[1],cur[3]))

ChrisA
 
C

Chris Angelico

t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]
result = []
for cur in a:
result.append("%s - %d"%(t[0],cur[2]))
result.append("%s - %d"%(t[1],cur[3]))

Whoops, I misread the desired output, I thought you wanted a
four-string list. It's two strings. That's actually easier, and Mark's
solution is pretty much what I'd go for.

ChrisA
 
J

Jussi Piitulainen

Ravi said:
I'm completely new to python. I just need simple logic to get output
without any loops.
I have list of string and list of list of numbers.
Each string should be concatenated with every third and fourth
values to generate proper titles in list of strings.

t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]


Expected Result : ( list of strings )

['Start - 3 , End - 4',
'Start - 7 , End - 8']

Note : First 2 values from each list should be ignored.


Could anyone please guide me with best solution without loops ?

That's a strange requirement - to have repetition without loops, in
Python, and still have a best solution.

I suppose it's fine to have a (built-in) function do the looping for
you so that there is no explicit loop in your own code. The .format
method of Python strings can do each individual string:

list(map('{2} - {0} , {3} - {1}'
.format('{0[2]}', '{0[3]}', *t)
.format, a))

The first (inner) call of .format builds the actual format string
whose .format method then builds each output string: {0[2]} in a
format string refers to the argument position 0 and its element
position 2; *t spreads the two elements of t as further positional
arguments.

If you have any background in functional programming with lists, map
should be fine and familiar. I would probably build and name the
format string outside the actual call as follows (untested).

start, end = t
format = ( '{2} - {0} , {3} - {1}'
.format('{0[2]}', '{0[3]}', start, end)
.format )
list(map(format, a))

All other things that come to mind would either be too much like loops
or they couldn't possibly be a best solution.

Incidentally, if you want a one-liner and tolerate long lines, the
first form I gave is perfectly good for that purpose.

I think *t and str.format require version 3 of Python.
 
P

Peter Otten

Jussi said:
Ravi said:
I'm completely new to python. I just need simple logic to get output
without any loops.
I have list of string and list of list of numbers.
Each string should be concatenated with every third and fourth
values to generate proper titles in list of strings.

t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]


Expected Result : ( list of strings )

['Start - 3 , End - 4',
'Start - 7 , End - 8']

Note : First 2 values from each list should be ignored.


Could anyone please guide me with best solution without loops ?

That's a strange requirement - to have repetition without loops, in
Python, and still have a best solution.

I suppose it's fine to have a (built-in) function do the looping for
you so that there is no explicit loop in your own code. The .format
method of Python strings can do each individual string:

list(map('{2} - {0} , {3} - {1}'
.format('{0[2]}', '{0[3]}', *t)
.format, a))

Don't do that if t may contain user data. For the sake of the argument let's
assume that a[...][0:2] is confidential. Then
t = "{0[0]}", "{0[1]}"
list(map('{2} - {0} , {3} - {1}'
.... .format('{0[2]}', '{0[3]}', *t)
.... .format, a))
['1 - 3 , 2 - 4', '5 - 7 , 6 - 8']

(I think doubling the braces is sufficient to fix this)
The first (inner) call of .format builds the actual format string
whose .format method then builds each output string: {0[2]} in a
format string refers to the argument position 0 and its element
position 2; *t spreads the two elements of t as further positional
arguments.
 
J

John Gordon

In said:
Hi,
I'm completely new to python. I just need simple logic to get output without any loops.
I have list of string and list of list of numbers.
Each string should be concatenated with every third and fourth values to generate proper titles in list of strings.
t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]

Expected Result : ( list of strings )
['Start - 3 , End - 4',
'Start - 7 , End - 8']
Note : First 2 values from each list should be ignored.

Could anyone please guide me with best solution without loops ?

output_list = []
t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]

output_list.append('%s - %s, %s - %s' % (t[0], a[0][2], t[1], a[0][3]))
output_list.append('%s - %s, %s - %s' % (t[0], a[1][2], t[1], a[1][3]))

print output_list
 
T

Terry Reedy

The remainder of your description and example imply that this must be a
sequence of exactly two strings. In other words, 'list' is both too
specific as to class and not specific enough as to length.

While this must be an iterable of sequences of exactly 4 numbers.
Each string should be concatenated with every third and fourth values
to generate proper titles in list of strings.

t = ['Start','End']
a = [[1,2,3,4],
[5,6,7,8]]

Expected Result : ( list of strings )

['Start - 3 , End - 4',
'Start - 7 , End - 8']

Note : First 2 values from each list should be ignored.

Could anyone please guide me with best solution without loops ?

If the length of the iterable of sequences is not fixed, a loop of some
sort is needed.
I've no idea what your definition of "best" is but this works.

strings = ['{} - {} , {} - {}'.format(t[0], b[-2], t[1], b[-1]) for b in a]

Very nice. The following use the format mini language to do the
indexing, avoiding passing the args twice each.

strings = ['{0[0]} - {1[2]} , {0[1]} - {1[3]}'.format(t, b) for b in a]

form = '{src[0]} - {val[2]} , {src[1]} - {val[3]}'
strings = [form.format(src=t, val=b) for b in a]

The first should be faster, but may be less readable. Note that '-2' and
'-1' do not work as int indexes in the field names because they would be
interpreted as string keys rather than integers.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,226
Members
46,816
Latest member
nipsseyhussle

Latest Threads

Top