简体   繁体   中英

How to compare strings containing numbers in a list?

how do I delete a row of strings containing numbers bigger than a certain threshold from a list.

I want my threshold to be more than 60, since it's impossible for songs to have a duration of 4:63 (4 mins 63 secs)

List before being filtered:

[['4:63', ' Test', 'Results'], ['A', 'B', 'C'], ['D', '4:20', 'F']]

Intended List after being filtered:

[['A', 'B', 'C'], ['D', '4:20', 'F']]

So basically my question is: how do I identify inside a list of list, and delete the rows for the strings containing a number bigger than 60.

My code:

def get_csv_as_table(a, b):
    import csv

    with open(a) as csv_file:
        file_reader = csv.reader(csv_file, delimiter=b)
        member = list(file_reader) 
        for i in range(len(member)):
            for j in range(len(member)):
                if member[i][j].isdigit():
                    member[i][j] = int(member[i][j])
        print(member)
        return member

def filter_table(member):
    clean_sample_data = [row for row in member if not "" in row]
    print(clean_sample_data)

member = []
print ("Enter filename: ")
a = input()
print ("Enter the delimiter: ")
b = input()
member = get_csv_as_table(a, b)
filter_table(member)

You can use a regex to get all the numbers and then use any() to check that none of them are above 60 in a list comprehension:

import re

lst = [['4:63', ' Test', 'Results'], ['A', 'B', 'C'], ['D', '4:20', 'F']]
filtered_lst = [
    sub_lst 
    for sub_lst in lst
    if not any(x > 60 for x in map(int, re.findall(r'\d+', ''.join(sub_lst))))
]
print(filtered_lst)

Output:

[['A', 'B', 'C'], ['D', '4:20', 'F']]

One way letting datetime.strptime to judge:

import re
from datetime import datetime

matcher = lambda x: re.match("\d+:\d+", x)

def is_validtime(str_):
    if matcher(str_):
        try:
            ms = datetime.strptime(str_, "%M:%S")
        except:
            return False
    return True

[i for i in l if all(is_validtime(j) for j in i)] 

Output:

[['A', 'B', 'C'], ['D', '4:20', 'F']]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM