2011-04-28 55 views
17

我想在文本文件中找到每行的結構。 (所以是的,基本上我想定義我的結構,然後計算行數,並填充我的結構。)Python - 「Struct數組」

在C++中,C#很好。但是我總是迷失在Python中。

我的結構看起來像:

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

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

等。
(很抱歉的瘸腿問題,希望其他的新手(像我一樣),會發現它是有用的。)

當然,隨意編輯的問題(標題),以反映真實的東西。

+6

如果繼續想在C++或C#中,你會總是在Python中迷失方向。如果你想停止在Python中迷路,你必須停止使用C++和C#術語。這很難做到,但它是唯一能夠毫無損失的方法。我們無法編輯標題以反映您的理解。你必須擴大你的理解,然後修改標題。您可能想再次閱讀http://docs.python.org/dev/library/stdtypes.html。 – 2011-04-28 20:35:32

回答

14
+0

@S。洛特,爲什麼不只是不僅限於更新的Python版本的字典。 – kanaka 2011-04-28 20:38:23

+0

@kanaka:'['foo']'比'.foo'更難輸入,並且沒有添加任何值(假設名字是固定的,如果名字是動態的,你應該使用dicts,是的)。 2.6並不近,你應該使用它,除非你不被生產環境所使用。 – delnan 2011-04-28 20:40:29

+1

@ kanaka:升級比通過不適當的數據結構混淆更容易。 – 2011-04-28 20:43:39

4

怎麼樣的一個列表?

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

然後,你可以做

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

等等...

使用您的樣本文件:

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]}) 

爲您提供:

[{'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'} 
...] 
+0

+1,我寫的是一樣的,你比較快。 – lecodesportif 2011-04-28 20:31:17

+0

我該如何自動化?就像...我正在從文件中讀取,然後如何創建它們?像...我如何參考他們? (如果這是一個新問題,對不起。感謝(非常)快速的回答。) – Shiki 2011-04-28 20:31:41

+0

你的文件是什麼樣的? – 2011-04-28 20:32:13

11

您想創建一個class,其中包含nameplace字段。

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

然後你會使用該類的實例的list

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

另請參閱:classes (from the Python tutorial)

0

你可以使用字典或做一個小班。

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

此外,我建議不要在python中命名爲'struct',因爲這是一個python模塊。

2

IIt取決於您擁有的數據。

如果所有你想要的是存儲的名稱和地點爲字符串,我建議:

namedtuples [(name="foo", place="Shop"), (name="bar", place="Home")]

+0

這是不必要的,並與Python 2.6和更舊版本不兼容。 – kanaka 2011-04-28 20:37:22

2

對於幾乎所有的案件清單,Python列表類似於C數組。 Python有一個array模塊,但這是一個圍繞實際C數組的薄包裝,所以我不會使用它,除非您需要向/從C展示某些東西。

此外,結構可以很容易地表示爲對象。喜歡的東西:

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

然後你通過文件,一行一行地要循環,並填充:

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 

這應該是足夠的一個起點,讓你感動,並幫助您瞭解如何做基本的文件/類/列表操作。

0
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

不明白爲什麼要採取這麼多的痛苦

類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