I am trying to check if a list has both empty and non-empty values. My code is as follows.
list = ['','a','b','']
not_empth = not float('NaN')
if float('NaN') and not_empth in list:
print('List has both empty and non-empty values.')
else:
print('List does not have both empty and non-empty values.')
However, the output shows as below, which is not correct.
List does not have both empty and non-empty values.
CodePudding user response:
This checks to see if a list contains both empty strings and non-empty strings
list = ['','a','b','']
has_empty = any(s == '' for s in list) #for items in list, if any equal '' then return true
has_non_empty = any(s != '' for s in list) #for items in list, if any do not equal '' then return true
if has_empty and has_non_empty:
print('List has both empty and non-empty values.')
else:
print('List does not have both empty and non-empty values.')
CodePudding user response:
list = ["Efsf","efsfs",""]
list1 = ["",'']
list2 = ["fsef",5 ,5]
def check(list):
null =''
if null in list and len(list)-list.count(null)>0:
print("List has both empty and non-empty values.")
else:
print("List does not have both empty and non-empty values.")
check(list)
check(list1)
check(list2)
output:
List has both empty and non-empty values.
List does not have both empty and non-empty values.
List does not have both empty and non-empty values.
CodePudding user response:
You could use a for loop
, as a different approach to this. Please note I changed float("NaN") to ''
due to the reason @j1-lee said.
PLEASE NOTE: This approach is not recommended if you have a large list.
list = ['','a','b','']
check_1 = 0 # 0 being represented as false.
check_2 = 0
for item in list:
if item == '':
check_1 = 1
else:
check_2 = 1
if check_1 and check_2 == 1:
print(True)
else:
print(False)
Output: True
CodePudding user response:
Having some fun with functools.reduce
to accomplish this in one pass over the list.
lst = ['', 'a', 'b', '']
reduce(lambda acc, x: (acc[0], True) if x != '' else (True, acc[1]),
lst, (False, False))
# (True, True)
all(reduce(lambda acc, x: (acc[0], True) if x != '' else (True, acc[1]),
lst, (False, False)))
# True
Of course, this does have to evaluate every element in the list and cannot short-circuit.
CodePudding user response:
What you have in the question just needs an if in
operation to solve.
>>> list_ = ['','a','b','']
>>> if '' in list_:
... print('List has both empty and non-empty values.')
... elif list_ == []:
... print('List does not have both empty and non-empty values.')
...
List has both empty and non-empty values.
As long you have at least one ''
, the first condition will be fulfilled. For your second print statement, if I understand correctly, it is to check an empty list.