2012-02-02 26 views
2

我有一個類似的問題,但是我不知道術語是什麼如何將變量轉換成字符串在python

cat=5 
dog=3 
fish=7 
animals=[cat,dog,fish] 
for animal in animals: 
    print animal_name+str(animal) #by animal name, i mean the variable thats being used 

這將打印出來,

cat5 
dog3 
fish7 

所以我想知道是否有一個實際的方法或函數可以用來檢索正在使用的變量並將其轉換爲字符串。希望這可以在沒有爲每隻動物創建字符串的情況下完成。

編輯:

有沒有辦法做到這一點沒有字典?

+0

有沒有辦法做到這一點沒有字典? – thelost 2012-02-02 23:12:13

+1

相關:http://stackoverflow.com/questions/544919/python-can-i-print-original-var-name – 2012-02-02 23:14:23

+2

爲什麼你需要避免使用字典? – 2012-02-02 23:27:20

回答

11

你基本上問「我的代碼如何發現一個對象的名稱?」

def animal_name(animal): 
    # here be dragons 
    return some_string 

cat = 5 
print animal_name(cat) # prints "cat" 

quote從弗雷德裏克Lundh開發(在comp.lang.python)是特別這裏適當。

相同的方式,你得到的是貓,你在你的門廊發現的名稱: 貓(對象)本身不能告訴你它的名字,它不 不在乎 - 所以唯一的辦法找出它被稱爲是要求 所有的鄰居(命名空間),如果這是他們的貓(對象)...

...。而且不感到驚訝,如果你會發現,它是由許多名字, 或已知的無名字!

只是爲了好玩我嘗試使用sysgc模塊來實現animal_name,發現附近還打電話給你親切地知道作爲「貓」的對象,即面值整數5,由幾個名字:

>>> cat, dog, fish = 5, 3, 7 
>>> animal_name(cat) 
['n_sequence_fields', 'ST_GID', 'cat', 'SIGTRAP', 'n_fields', 'EIO'] 
>>> animal_name(dog) 
['SIGQUIT', 'ST_NLINK', 'n_unnamed_fields', 'dog', '_abc_negative_cache_version', 'ESRCH'] 
>>> animal_name(fish) 
['E2BIG', '__plen', 'fish', 'ST_ATIME', '__egginsert', '_abc_negative_cache_version', 'SIGBUS', 'S_IRWXO'] 

足夠獨特的對象,有時你可以得到一個獨特的名字:

>>> mantis_shrimp = 696969; animal_name(mantis_shrimp) 
['mantis_shrimp'] 

因此,簡言之:

  • 簡短的回答是:你不能。
  • 長的答案是:呃,實際上,你有點......至少在cpython實現中。 To see how I implemented animal_name in my example, look here
  • 正確答案是:使用dict,正如其他人在此提到的。當您實際需要知道名稱< - >對象關聯時,這是最佳選擇。
+1

我認爲這將有可能使用我在某處讀過的回溯。我可以故意導致變量出現錯誤,並將此錯誤放入字符串中,然後使用正則表達式來檢索變量。 – thelost 2012-02-03 00:32:23

+0

一個有趣的想法!如果你在這個方法上取得了一些成功,我會很感興趣。 – wim 2012-02-03 00:46:04

+0

如果可以的話,我會給你兩個upvotes的報價。 – ThatAintWorking 2012-02-03 13:25:26

0

我會更改爲使用字典變量,它可以讓您輕鬆地將字符串名稱映射到值。

animalDict['cat'] = 5 
animalDict['dog'] = 3 

然後,你可以通過鍵盤輸入並打印出你想要的東西。

0
myAnimals = {'cat':5,'dog':3,'fish':7} 
animals = ['cat','dog','fish'] 
for animal in animals: 
    if myAnimals.has_key(animal): print animal+myAnimals(animal) 
5

使用字典而不是一堆變量。

animals = dict(cat=5, dog=3, fish=7) 

for animal, count in animals.iteritems(): 
    print animal, count 

注意,他們可能沒有(可能不會)在你把它們以相同的順序出來。使用collections.ordereddict如果你只是需要他們以一致的順序可以解決這個問題,或只是通過排序鍵:

for animal in sorted(animals.keys()): 
    print animal, animals[animal] 
0

不是把變量放到列表中,而是將它們放到一個字典中。

在這裏:

cat = 7 

貓是變量,其7值爲

d={} 
d['cat']=5 
d['dog']=3 
d['fish']=7 

for item in d.keys(): 
    print item+' '+d[item] 
0

你與動物名稱的字符串混淆變量名:

cat = 'cat' 

貓仍然是變量,'貓'是帶有動物名稱的字符串。你可以放任何你喜歡的字符串,即使是cat = 'dog'

現在回到你的問題:你想打印出一個動物的名字和一個相關的數字。

要配對名稱和編號,最好的選擇是使用一個字典dict。在{}是代表一個字典(只是要完成也在某些情況下set

d = {3: 'cat', 5: 'dog', 7: 'fish'} 

d是您的變量。 {3: 'cat', 5: 'dog', 7: 'fish'}是你的字典。 3, 5, 7是這樣的詞典的'cat', 'dog', 'fish'是相應的值。
現在你已經在這個詞典上迭代了。可以做主叫d.items()

d = {3: 'cat', 5: 'dog', 7: 'fish'} 
for key,value in d.items(): 
    print(value, key) 

我顛倒了值,鍵順序diring印刷數量之前打印的名稱。