Vinnaren i pepparkakshustävlingen!
2012-12-11, 19:37
  #697
Medlem
Källkoden.


stock.py


Modulen ystockquote.py
Citera
2012-12-12, 01:45
  #698
Moderator
vhes avatar
Citat:
Ursprungligen postat av crouge
Vad jag förstå så ligger felet i httplib.py eller socket.py. Detta är väll standard libar som ska fungera.
Är det problem med timeout tiden? att den är ställd för kort? eller avvisa yahoos server mina anrop?

Jag har slut på ideer...

Det fetstilta. Connection reset by peer innebär att andra sidan inte vill prata längre, inte tänker skicka nån mer data tillbaks och inte är intresserad av att ta emot mer data. Det kan ske av flera orsaker, men det är inte din (eller standardlibbets) kod som direkt gör fel.
Om jag skulle gissa så kan de ha utrustning på andra sidan just för att förhindra bottar av den typen du kör. Du kan ju pröva att automatisera det hela och se om felet alltid dyker upp efter lika lång tid.
Annars kan du väl helt enkelt fånga felet och försöka igen med en ny socket.
Citera
2012-12-12, 14:50
  #699
Medlem
key33s avatar
Citat:
Ursprungligen postat av vhe
Det fetstilta. Connection reset by peer innebär att andra sidan inte vill prata längre, inte tänker skicka nån mer data tillbaks och inte är intresserad av att ta emot mer data. Det kan ske av flera orsaker, men det är inte din (eller standardlibbets) kod som direkt gör fel.
Om jag skulle gissa så kan de ha utrustning på andra sidan just för att förhindra bottar av den typen du kör. Du kan ju pröva att automatisera det hela och se om felet alltid dyker upp efter lika lång tid.
Annars kan du väl helt enkelt fånga felet och försöka igen med en ny socket.


Det kanske hjälper om man skickar med en header?
http://stackoverflow.com/a/802246/1863502
Citera
2012-12-20, 16:36
  #700
Medlem
tjungmans avatar
Tjena,

Jag har hämtat in en sträng genom en str(raw_input(etc....)) och har sedan använt mig av lite metoder för att få inmatningen att bli till små bokstäver, tagit bort möjliga kommatecken, mellanslag, slash-tecken osv.

Nästa steg är att definiera en funktion för att jämföra den nu omvandlade texten med sig själv baklänges (för att kolla om texten är en palindrom). Jag lyckas göra detta med en if-sats och allt funkar som det ska, men tanken är att detta skall göras med en for-loop där man kollar och jämför bokstav för bokstav.

Här har jag fastnat. Är helt lost. Läser och läser om for-loopar men lyckas inte koppla ihop hur jag skall gå tillväga. Jag har alltså en omgjord text (som bara innehåller gemener och inga mellanslag etc), samt att jag även gjort en variabel av denna fast omvänd. Så jag har alltså två texter, den omgjorda samt den omgjorda baklänges. (Använde mig av [::-1] för att vända på texten).

Men hur jämför jag dessa med varandra i en for-loop?

Är det möjligtvis så att man kanske inte ska vända på texten ens utan bara använda sig av den första texten och jämföra "platser" (indexering?), dvs. första platsen (0?) mot sista (-1?). Men vad har övriga platser för värde då strängen på förhand inte är bestämd, utan kan variera mellan typ 3 bokstäver och upp till hur många som helst?

Hjälp uppskattas!


EDIT: Kanske bör man använda len() för att räkna ut antalet tecken som den omgjorda texten innehåller?
__________________
Senast redigerad av tjungman 2012-12-20 kl. 16:40.
Citera
2012-12-20, 17:41
  #701
Medlem
tjungmans avatar
Citat:
Ursprungligen postat av tjungman
EDIT: Kanske bör man använda len() för att räkna ut antalet tecken som den omgjorda texten innehåller?

Har skrivit en for-loop som ser ut på följande sätt:
Kod:
def testa(sorteradText):
    testadText = True
    l = len(sorteradText)
    for i in range(0, l/2):
        if sorteradText[i] == sorteradText[l-1-i]:
            return False
        return True

På så sätt trodde jag att jag genom att sätta rangen till hälften och sen jämföra skulle det fungera.
Men nu är det lite hipp som happ. Har ytterligare en definition under som skriver ut om det är en palindrom eller inte beroende på vad programmet returnerar för booleanskt värde (True eller False). Men den säger oftast att det mesta är en palindrom, oavsett om det är så eller inte.

Ytterst märkligt. Någon som märker något fel i min for-loop?


EDIT: Har ändrat lite i for-loopen nu och får det att funka! Dock är det nog inte på "rätt" sätt, då uppgiften är att jämföra bokstav för bokstav (halva ordet, framifrån och bakifrån samtidigt så att säga). Jag löste det på följande sätt:

Kod:
def testa(sorteradText):
    testadText = True
    l = len(sorteradText)
    for i in range(0, l/2):
        if sorteradText == sorteradText[::-1]:
            return True
    return False
Där jag skrivit == sorteradText[::-1] gör ju att den jämför hela ordet omvänt (om jag förstått det hela rätt?) och inte genom att gå bokstav för bokstav i en loop. Stämmer det? Och hur bör man istället göra?
__________________
Senast redigerad av tjungman 2012-12-20 kl. 17:56.
Citera
2012-12-21, 01:50
  #702
Moderator
vhes avatar
Citat:
Ursprungligen postat av tjungman
Men hur jämför jag dessa med varandra i en for-loop?

Till att börja med: Din första lösning är rätt lösning. Att blanda in forloopar är bara komplicerat.
Men om du nu måste göra det så är det vettiga sättet att loopa igenom strängen (eventuellt bara halva, om man orkar optimera), och jämföra första och sista tecknet, sedan andra och näst sista, osv. Precis som du varit inne på.

Problemet med dina loopar är att du har en massa return i dem. En loop med en return-sats som exekverar kommer omedelbart att avsluta - så nästa iteration kommer aldrig köras. Det är endast vettigt att göra en return i en loop när man konstaterat att alla följande iterationer är onödiga. I palindromexemplet kan du ju t.ex. göra return så fort du konstaterat att det inte är ett palindrom. Dvs om t.ex. första och sista bokstaven är olika. Men om de är lika måste du ju fortfarande fortsätta och jämföra andra med näst sista, osv.

Skrev en liten snabb implementation som gör jobbet. Orkade inte optimera genom att bara gå halvvägs (om någon hittar ett användningsfall där performance i en palindromdetektor är viktig så....)

Kod:
#!/usr/bin/env python

def palindrome(s):
    for pos in xrange(len(s)):
        if s[pos] != s[len(s) - pos - 1]:
            return False
    return True

def test_palindrome():
    assert palindrome('a')
    assert palindrome('aa')
    assert palindrome('aba')
    assert palindrome('abba')
    assert palindrome('abcba')
    assert palindrome('tattarrattat')
    assert not palindrome('flashback')

if __name__ == '__main__':
    test_palindrome()

En aningen mer Pythonsk implementation är kanske:
Kod:
def palindrome(s):
    for forwards, backwards in zip(s, reversed(s)):
        if forwards != backwards:
            return False
    return True

Men den är ju i praktiken bara ett omständigare sätt att skriva:
Kod:
def palindrome(s):
    return s == s[::-1]

vilket du ju redan föreslagit. Som sagt, din första implementation vinner. Forloopar är helt onödigt.
Citera
2012-12-29, 02:37
  #703
Medlem
droles avatar
Säg att jag har en sträng(vid namn var) som ser ut såhär:
Kod:
1banan2
1frukt2
1gurka2

Min python-kod ser sedan ut såhär:
Kod:
import re

print re.search('1(.+?)2', var).group(1)
Skriptet kommer du att printa 'banan', hur får jag den att printa dom andra också?
Någon form av for-loop borde fungera men har inte lyckas klura ut hur.
Citera
2012-12-29, 03:35
  #704
Moderator
vhes avatar
Citat:
Ursprungligen postat av drole
Säg att jag har en sträng(vid namn var) som ser ut såhär:
Kod:
1banan2
1frukt2
1gurka2

Min python-kod ser sedan ut såhär:
Kod:
import re

print re.search('1(.+?)2', var).group(1)
Skriptet kommer du att printa 'banan', hur får jag den att printa dom andra också?
Någon form av for-loop borde fungera men har inte lyckas klura ut hur.

Du behöver re.findall. re.search hittar bara den första träffen.
Citera
2012-12-29, 13:13
  #705
Medlem
tjungmans avatar
Citat:
Ursprungligen postat av vhe
vilket du ju redan föreslagit. Som sagt, din första implementation vinner. Forloopar är helt onödigt.

Tack så jättemycket för hjälpen! God fortsättning!
Citera
2012-12-29, 14:09
  #706
Medlem
droles avatar
Citat:
Ursprungligen postat av vhe
Du behöver re.findall. re.search hittar bara den första träffen.
Ah, tack. Tänkte inte ens på att kolla på andra funktioner i biblioteket för regulära jämnförelser
Men men, vhe räddar dagen igen
Citera
2012-12-30, 23:02
  #707
Medlem
droles avatar
Problem nummer två, I need you vhe
(men någon annan får också självklart hjälpa till...)

Kod:
>>> var = """		    <BeginOfStory>
			<begin>StrangeFact</begin>
			Sometimes you can
			
just do whatever you want.

When it's is like that it's a good idea

to kill a horse. If that's illegal, just change the operator.
			</endOfStory>"""

>>> print var
		    <BeginOfStory>
			<begin>StrangeFact</begin>
			Sometimes you can
			
just do whatever you want.

When it's is like that it's a good idea

to kill a horse. If that's illegal, just kill your mothers dog.
			</endOfStory>

>>> repr(var)
'"\\t\\t    <BeginOfStory>\\n\\t\\t\\t<begin>StrangeFact</begin>\\n\\t\\t\\tSometimes you can\\n\\t\\t\\t\\njust do whatever you want.\\n\\nWhen it\'s is like that it\'s a good idea\\n\\nto kill a horse. If that\'s illegal, just kill your mothers dog.\\n\\t\\t\\t</endOfStory>"'

>>> re.findall('BeginOfStory(.+?)endOfStory', var)
[]

Varför får jag tillbaka en tom array?
__________________
Senast redigerad av drole 2012-12-30 kl. 23:05.
Citera
2012-12-31, 00:19
  #708
Medlem
regex är inte min starka sida så jag kan inte hjälpa dig med din fråga,
men det känns som vad du vill uppnå är bättre att göra med XML och en XMLparser än att hitta på något eget.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback