Is there a way to return only the first word in a set
Question:
from nltk.corpus import wordnet as wn
def antonyms_for(word):
antonyms = set()
for ss in wn.synsets(word):
for lemma in ss.lemmas():
any_pos_antonyms = [ antonym.name() for antonym in lemma.antonyms() ]
for antonym in any_pos_antonyms:
antonym_synsets = wn.synsets(antonym)
if wn.ADJ not in [ ss.pos() for ss in antonym_synsets ]:
continue
antonyms.add(antonym)
return antonyms
print(antonyms_for("bad"))
prints: {'unregretful', 'good'}
is there a way to print only the first word {'unregretful', 'good'} -> {'unregretful'}
Answers:
You can use iter
+next
:
next(iter(antonyms_for("bad")))
output: 'good'
or 'unregretful'
Note that sets are unordered, so there is no way to reliably obtain a given value, it is not random either, you will just get what the hashing algorithm puts first in the python implementation that you are using.
If you don’t care about the state of the set that’s returned, you could use the method pop()
on it:
print(antonyms_for("bad").pop())
This will return ONE of the set items. There is no definitive notion of first in a set as they are unordered.
If you expect the first value in alphabetical order then you can use built-in function min()
:
print(min(antonyms_for("bad",default=None)))
[EDIT] To avoid getting an error from .pop() when the output set is empty, you can use or {None}
in the statement:
print( (antonyms_for("bad") or {None}).pop() )
Sets are unordered collections (not sequences), so there is no first or last.
You can transform the iterable set to a sequence, e.g. one of the following data structures
- list, using constructor
list(iterable)
- tuple, using constructor
tuple(iterable)
and then use indexing to obtain the first:
words_set = antonyms_for("bad")
if words_set:
first_word = tuple(words_set)[0]
print(f'First antonym: {first_word}') # expected to print 'unregretful'
else:
print('No antonym found!')
Since there may be cases with an empty set returned, you may test for the presence of any elements first using if words_set:
.
from nltk.corpus import wordnet as wn
def antonyms_for(word):
antonyms = set()
for ss in wn.synsets(word):
for lemma in ss.lemmas():
any_pos_antonyms = [ antonym.name() for antonym in lemma.antonyms() ]
for antonym in any_pos_antonyms:
antonym_synsets = wn.synsets(antonym)
if wn.ADJ not in [ ss.pos() for ss in antonym_synsets ]:
continue
antonyms.add(antonym)
return antonyms
print(antonyms_for("bad"))
prints: {'unregretful', 'good'}
is there a way to print only the first word {'unregretful', 'good'} -> {'unregretful'}
You can use iter
+next
:
next(iter(antonyms_for("bad")))
output: 'good'
or 'unregretful'
Note that sets are unordered, so there is no way to reliably obtain a given value, it is not random either, you will just get what the hashing algorithm puts first in the python implementation that you are using.
If you don’t care about the state of the set that’s returned, you could use the method pop()
on it:
print(antonyms_for("bad").pop())
This will return ONE of the set items. There is no definitive notion of first in a set as they are unordered.
If you expect the first value in alphabetical order then you can use built-in function min()
:
print(min(antonyms_for("bad",default=None)))
[EDIT] To avoid getting an error from .pop() when the output set is empty, you can use or {None}
in the statement:
print( (antonyms_for("bad") or {None}).pop() )
Sets are unordered collections (not sequences), so there is no first or last.
You can transform the iterable set to a sequence, e.g. one of the following data structures
- list, using constructor
list(iterable)
- tuple, using constructor
tuple(iterable)
and then use indexing to obtain the first:
words_set = antonyms_for("bad")
if words_set:
first_word = tuple(words_set)[0]
print(f'First antonym: {first_word}') # expected to print 'unregretful'
else:
print('No antonym found!')
Since there may be cases with an empty set returned, you may test for the presence of any elements first using if words_set:
.