Thrillofit86
Thrillofit86

Reputation: 619

How to use two different .format() with using one for-loop

So I have been trying to figure out how I can print out two different formats using one for loop. I would like to provide the code before explaining my issue

fullList = [
  {
    'url': 'www.randomsite.com/251293',
    'numbers': '7.5'
  },
  {
    'url': 'www.randomsite.com/251294',
    'numbers': '8'
  },
  {
    'url': 'www.randomsite.com/251295',
    'numbers': '8.5'
  },
  {
    'url': 'www.randomsite.com/251296',
    'numbers': '9'
  },
  {
    'url': 'www.randomsite.com/251297',
    'numbers': '9.5'
  }
]

#fullList = [
#  {
#    'numbers': '7.5'
#  },
#  {
#    'numbers': '8'
#  },
#  {
#    'numbers': '8.5'
#  },
#  {
#    'numbers': '9'
#  },
#  {
#    'numbers': '9.5'
#  }
#]

try:
    numbersList = []
    for numbers in fullList:
        numbersList.append('{}{}'.format('{}'.format(numbers.get('url') if numbers.get('url') else ''), numbers.get('numbers')))

    print(numbersList)
except Exception:
    pass

and what I am looking for outcome is:

If url is in the list: print('<url|numbers>') meaning the format would be <url|numbers>

If no url is in the list: print(numbers) and the print here should only give the numbers - I sometimes just want the numbers, meaning that in the list I removed all URL's so it will only remain numbers.

My problem is that I dont know how I can combine these two into one format. So far I am able to print out only numbers with the code I have provided.

Upvotes: 3

Views: 71

Answers (4)

bharatk
bharatk

Reputation: 4315

Using list comprehension

Ex.

fullList = [
  {'url': 'www.randomsite.com/251293','numbers': '7.5'},
  {'url': 'www.randomsite.com/251294','numbers': '8'},
  {'url': 'www.randomsite.com/251295','numbers': '8.5'},
  {'url': 'www.randomsite.com/251296','numbers': '9'},
  {'url': 'www.randomsite.com/251297','numbers': '9.5'}
]

list1 = [ "{0}|{1}".format(x['url'],x['numbers']) for x in fullList ]
print(list1)

O/P:

['www.randomsite.com/251293|7.5', 'www.randomsite.com/251294|8', 'www.randomsite.com/251295|8.5', 'www.randomsite.com/251296|9', 'www.randomsite.com/251297|9.5']

OR

for the updated question, if the dictionary does not contain url

fullList = [
  {'url': 'www.randomsite.com/251296','numbers': '9'},
  {'numbers': '9.5'}
]
list1 = [ "{0}{1}".format((x.get('url')+'|' if 'url' in x else ''),x.get('numbers','')) for x in fullList ]
print(list1)

O/P:

['www.randomsite.com/251296|9', '9.5']

Upvotes: 1

Alexandre B.
Alexandre B.

Reputation: 5502

One solution is to select all values in each subdict and join them with a custom delimiter. In this way, you don't care if the key/value exist or not.

# Let's consider partial data
fullList = [
    {
        'url': 'www.randomsite.com/251293',
        'numbers': '7.5'
    },
    {
        'url': 'www.randomsite.com/251294',
        'numbers': '8'
    },
    {
        'url': 'www.randomsite.com/251295',
        'numbers': '8.5'
    },
    {
        'url': 'www.randomsite.com/251296',
    },
    {
        'numbers': '9.5'
    }
]


numbersList = []
for element in fullList:
    numbersList.append("|".join([element[v] for v in element.keys()]))

print(numbersList)
# ['www.randomsite.com/251293|7.5', 'www.randomsite.com/251294|8',
#     'www.randomsite.com/251295|8.5', 'www.randomsite.com/251296', '9.5']

You can do it in one line with list comprehension:

output = ["|".join([element[v] for v in element.keys()]) for element in fullList]
print(output)
# ['www.randomsite.com/251293|7.5', 'www.randomsite.com/251294|8', 
# 'www.randomsite.com/251295|8.5', 'www.randomsite.com/251296', '9.5']

Upvotes: 1

sidx
sidx

Reputation: 640

You can solve this problem and it will look more pythonic this way:

fullList = [
  {'url': 'www.randomsite.com/251293', 'numbers': '7.5'}, 
  {'url': 'www.randomsite.com/251294', 'numbers': '8'}, 
  {'url': 'www.randomsite.com/251295', 'numbers': '8.5'}, 
  {'url': 'www.randomsite.com/251296', 'numbers': '9'}, 
  {'url': 'www.randomsite.com/251297', 'numbers': '9.5'}, 
  {'numbers': '100'}
]


[(x['url'] + '|' + x['numbers']) if x.get('url') else x['numbers'] for x in fullList ]

You are using list comprehensions, minimizing nesting etc.

Upvotes: 1

furas
furas

Reputation: 142641

Use normal if/else. It will be more readable. And you have only one format.

for numbers in fullList:
    if numbers.get('url'):
        numbersList.append('{}|{}'.format(numbers.get('url'), numbers.get('numbers'))
    else:
        numbersList.append(numbers.get('numbers'))

Upvotes: 1

Related Questions