0

I have looked at this solution but my requirements are slightly different.

I have a string of the form: "command int1 int2", e.g. "download 600 10".

I know I could use str.split(" ") to break the string into its component parts but then I would have to convert the 2nd and 3rd parameters to ints. Thus the following won't work (the int cast fails when it encounters "download" in the string):

(cmd, int1, int2) = [int(s) for s in file.split(' ')]

I'm still pretty new to Python... so I'm wondering if there is a nice, pythonic way to accomplish my goal?

RobertJoseph
  • 7,968
  • 12
  • 68
  • 113

5 Answers5

5

You could maps types to values:

>>> types = (str, int, int)
>>> string = 'download 600 10'
>>> cmd, int1, int2 = [type(value) for type, value in zip(types, string.split())]

>>> cmd, int1, int2
('download', 600, 10)
Peter Wood
  • 23,859
  • 5
  • 60
  • 99
1

It depends on your take on what "pythonic" means to you, but here's another way:

words = file.split(" ")
cmd, (int1, int2) = words[0], map(int, words[1:])
jdehesa
  • 58,456
  • 7
  • 77
  • 121
1

There isn't anything more Pythonic in the standard library. I suggest you just do something simple such as:

cmd = file.split(' ')
command = cmd[0]
arg1 = int(cmd[1])
arg2 = int(cmd[2])

You could always try to look for a little parser, but that would be overkill.

Horia Coman
  • 8,681
  • 2
  • 23
  • 25
1

From here I have imported the following function, which use isdigit() (see here):

def check_int(s): # check if s is a positive or negative integer
    if s[0] in ('-', '+'):
        return s[1:].isdigit()
    return s.isdigit()

Then you need only this code:

your_string = "download 600 10" 
elements = your_string.split(" ")
goal = [int(x) for x in elements if check_int(x)]

cmd, (int1,int2) = elements[0], goal
Community
  • 1
  • 1
titiro89
  • 2,058
  • 1
  • 19
  • 31
0

You can do it like this.

file = "downlaod 600 10"
file_list = file.split(' ')
for i in range(len(file_list)):
 try:
   file_list[i] = int(file_list[i])
 except ValueError:
    pass    
(cmd, int1, int2) = file_list
Abdullah Danyal
  • 1,106
  • 1
  • 9
  • 25