user3036519
user3036519

Reputation: 115

Python - Printing words by length

I have a task where I have to print words in a sentence out by their length. For example:

Sentence: I like programming in python because it is very fun and simple.
>>> I
>>> in it is
>>> fun and
>>> like very
>>> python simple
>>> because

And if there is no repetitions:

Sentence: Nothing repeated here
>>> here
>>> Nothing
>>> repeated

So far I have got this so far:

wordsSorted = sorted(sentence, key=len)

That sorts the words by their length, but I dont know how to get the correct output from the sorted words. Any help appreciated. I also understand that dictionaries are needed, but Im not sure. Thanks in advance.

Upvotes: 1

Views: 1406

Answers (4)

John La Rooy
John La Rooy

Reputation: 304167

This can be done using a defaultdict (or a regular dict) in O(N) time. sort+groupby is O(N log N)

words = "I like programming in python because it is very fun and simple".split()
from collections import defaultdict
D = defaultdict(list)
for w in words:
    D[len(w)].append(w)

for k in sorted(D):
    print " ".join(d[k])
I
in it is
fun and
like very
python simple
because
programming

Upvotes: 2

Ashwini Chaudhary
Ashwini Chaudhary

Reputation: 250951

First sort the words based on length and then group them using itertools.groupby again on length:

>>> from itertools import groupby         
>>> s = 'I like programming in python because it is very fun and simple'
>>> for _, g in groupby(sorted(s.split(), key=len), key=len):
    print ' '.join(g)
...     
I
in it is
fun and
like very
python simple
because
programming

You can also do it using a dict:

>>> d = {}
>>> for word in s.split():
    d.setdefault(len(word), []).append(word)
...  

Now d contains:

>>> d
{1: ['I'], 2: ['in', 'it', 'is'], 3: ['fun', 'and'], 4: ['like', 'very'], 6: ['python', 'simple'], 7: ['because'], 11: ['programming']}

Now we need to iterate over sorted keys and fetch the related value:

>>> for _, v in sorted(d.items()):
    print ' '.join(v)
...     
I
in it is
fun and
like very
python simple
because
programming

If you want to ignore punctuation then you can strip them using str.strip with string.punctuation:

>>> from string import punctuation
>>> s = 'I like programming in python. Because it is very fun and simple.'
>>> sorted((word.strip(punctuation) for word in s.split()), key=len)
['I', 'in', 'it', 'is', 'fun', 'and', 'like', 'very', 'python', 'simple', 'Because', 'programming']

Upvotes: 6

thiruvenkadam
thiruvenkadam

Reputation: 4250

Using dictionary simplifies it

input = "I like programming in python because it is very fun and simple."
output_dict = {}
for word in input.split(" "):
    if not word[-1].isalnum():
        word = word[:-1]
    if len(word) not in output_dict:
        output_dict[len(word)] = []
    output_dict[len(word)].append(word)
for key in sorted(output_dict.keys()):
    print " ".join(output_dict[key])

This actually removes the comma, semicolon or full stop in a sentence.

Upvotes: 0

Avinash Garg
Avinash Garg

Reputation: 1402

try this:

str='I like programming in python because it is very fun and simple'

l=str.split(' ')
sorted(l,key=len)

it will return

['I', 'in', 'it', 'is', 'fun', 'and', 'like', 'very', 'python', 'simple', 'because', 'programming']

Upvotes: 0

Related Questions