Mam to, że wygląda tak w pliku .txt:

a
baby
*
27
int

Po przeczytaniu w pliku, w jaki sposób chodzę na oddzielenie tej listy na listę 5 innych list? Na przykład,

char_list = ['a']
str_list = ['baby']
special = ['*']
digit = [27]
data_type = ['int']

Czy w Pythonie jest specjalna funkcja? Nie chcę robić czegoś podobnego

# I don't even know if this is legal
new_array = []
for x in foo:
    if x in "*"
        new_array.append(x)

Po wykonaniu:

strz = [item for item in text if isinstance(item,str)]
print strz

Mówi mi, że wszystkie są ciągi.

1
BayCode 12 październik 2017, 13:39

2 odpowiedzi

Najlepsza odpowiedź

Oto funkcja sprawdzająca wejście dla tego typu, jak określono powyżej (z dodatkiem pływaków).

def type_check(x):
    if not x:
        return 'none'
    try:
        int(x)
        return 'int'
    except:
        pass
    try:
        float(x)
        return 'float'
    except:
        pass
    if len(x)==1:
        if x.isalpha():
            return 'char'
        else:
            return 'special'
    if x in ('int','float','str'):
        return 'data_type'
    return 'str'

Teraz możesz utworzyć słownik, aby śledzić każdy typ.

from collections import defaultdict

type_dict = defaultdict(list)

# create a variable that mimics your file...
f = '''a
baby
*
27
int'''.split()

for line in f:
    t = type_check(line.strip())
    type_dict[t].append(line.strip())

type_dict
# returns:
defaultdict(list,
            {'char': ['a'],
             'data_type': ['int'],
             'int': ['27'],
             'special': ['*'],
             'str': ['baby']})
1
James 12 październik 2017, 11:23

Możesz napisać własny parser, ale nie proponuję tego. Tylko jeśli nalegasz - tutaj jest przykład SoulTion:

from collections import defaultdict
from string import punctuation
from string import ascii_letters

def parser(lines):
  parsed = defaultdict(list)

  for line in lines.splitlines():
    if line.isdigit():
      parsed['digits'].append(int(line))
    elif len(line) == 1:
      if line in ascii_letters:
        parsed['chars'].append(line)
      elif line in punctuation:
        parsed['specials'].append(line)
    else:
      if line in __builtins__:
        parsed['types'].append(line)
      else:
        parsed['strings'].append(line)
  return parsed

with open(your_file) as file:
    parsed = parser(file.read())
print(parsed)
0
Yaroslav Surzhikov 12 październik 2017, 11:23