web-dev-qa-db-fra.com

Python - "Tableaux de structures"

J'aimerais avoir une structure pour chaque ligne trouvée dans un fichier texte. (Donc oui, en gros, je veux définir ma structure, puis compter les lignes et remplir mes structures.) 

En C++, C # c'est bien. Mais je suis toujours perdu en Python. 

Ma structure ressemblerait à ceci: 

struct[0].name = "foo"  
struct[0].place = "Shop"  

struct[1].name = "bar"  
struct[1].place = "Home"  

Etc.
(Désolé pour la question boiteuse, j'espère que d'autres débutants (comme moi) le trouveront utile.) 

Bien sûr, n'hésitez pas à modifier la question (titre) pour refléter la réalité.

19
Shiki
15
S.Lott

Vous voulez créer un class qui contient les champs name et place.

class Baz():
    "Stores name and place pairs"
    def __init__(self, name, place):
        self.name = name
        self.place = place

Ensuite, vous utiliseriez un list of instances de cette classe.

my_foos = []
my_foos.append(Baz("foo", "Shop"))
my_foos.append(Baz("bar", "Home"))

Voir aussi: classes (tiré du tutoriel Python) .

14
Matt Ball

Que diriez-vous d'une liste de dicts?

mydictlist = [{"name":"foo", "place":"Shop"},
              {"name":"bar", "place":"Home"}]

Alors tu peux faire

>>> mydictlist[0]["name"]
'foo'
>>> mydictlist[1]["place"]
'Home'

etc...

En utilisant votre exemple de fichier:

mydictlist = []
with open("test.txt") as f:
    for line in f:
        entries = line.strip().split(" ", 5) # split along spaces max. 5 times
        mydictlist.append({"name": entries[0],
                           "time1": entries[1],
                           "time2": entries[2],
                           "etc": entries[5]})

vous donne:

[{'etc': 'Vizfoldrajz EA eloadas 1', 'name': 'Hetfo', 'time2': '10:00', 'time1': '8:00'}, 
 {'etc': 'Termeszetfoldrajzi szintezis EA eloadas 1', 'name': 'Hetfo', 'time2': '14:00', 'time1': '12:00'}, 
 {'etc': 'Scriptnyelvek eloadas 1', 'name': 'Hetfo', 'time2': '16:00', 'time1': '14:00'}
 ...]
5
Tim Pietzcker

Cela dépend de ce que vous avez comme données.

Si tout ce que vous voulez est de stocker les noms et les lieux sous forme de chaîne, je vous suggère:

Une liste de nommés [(name="foo", place="Shop"), (name="bar", place="Home")]

3
Xavier V.

Dans presque tous les cas, une liste Python est analogue à un tableau C. Python a un module array, mais il s’agit d’une mince couche de protection autour des tableaux de C, donc je ne l’utiliserai pas à moins d’exposer quelque chose à/de C.

De plus, une structure peut facilement être représentée sous forme d'objet. Quelque chose comme:

class Data(object):
    def __init__(self, name, place):
        self.name = name
        self.place = place

Ensuite, vous souhaitez parcourir le fichier, ligne par ligne, et remplir:

my_list = []
with open("myfile.txt") as f:
    for line in f.readlines():
        # line is each line in the file
        # let's pretend our file structure is "NAME PLACE"
        data = line.split() # data[0] = name, data[1] = place
        my_list.append(Data(data[0], data[1]))

# my_list now contains objects of class Data, which has members name and place

Cela devrait être un point de départ suffisant pour vous faire bouger et vous aider à comprendre comment effectuer des opérations de base sur les fichiers/classes/listes.

2
Nick Presta

Vous pouvez utiliser un dict ou faire une petite classe.

0
Juri Robl
>>> s = [{'name': 'foo', 'place': 'shop'}, {'name': 'bar', 'place': 'home'}]
>>> s[0]['name']
'foo'

Aussi, je recommanderais de ne pas le nommer 'struct' en python puisqu'il s'agit d'un module python.

0
kanaka

Je ne vois pas pourquoi prendre autant de douleur 

class your_struct (): 

def __init__(self, value, string):
    self.num = value
    self.string = string

C = [[ your_struct(0,'priyank') for j in range(len(n)) ] for i in                 
     range(len(n)) ]
   # for 2-D Matrix

C = [ your_struct(0,'priyank') for j in range(len(n)) ]  // for 1-D array 
0
Priyank Pathak
class Struct:
   def __init__(self, name, place):
      self.name = name
      self.place = place

structs = []
structs.append(Struct("foo","bar"))
structs.append(Struct("other_foo","other_bar"))
0
vichle