Python programozás - Szoftverfejlesztés fórum

üzenetek

hozzászólások


cousin333
(addikt)
Blog

Üdv!

A te példád alapján, de nem teljesen azt folytatva (szóval még dolgozni kell rajta), nekem ez jött ki. Hozzáteszem, hogy én Python 3.2.3-at használtam, ami nem teljesen kompatibilis a 2.7-es szériával (amit a kódod alapján te használtál). Szóval a kód:

# előregyártott fejléc a sorok egyes elemeihez
rekord = ['Kod', 'Repter', 'Terv', 'Indulas', 'Terminal', 'Megjegyzes']

# a fájl megnyitása olvasásra, ez a "with" szerkezetes megoldás a végén be is zárja azt, a fájl objektum neve (a példád alapján) f1
with open('d:\\text.txt', 'r') as f1:

# adatok beolvasása soronként, sorvégi újsor karakterek ("\n") levágása
# egy-egy sor szétbontása tabulátorokkal határolt elemekre
# könyvtár-listát hoz létre az elemekből a "rekord" nevű fejlécekkel
# az üres sorokat kihagyja
# 'Terminal': '1', 'Indulas': '05:59', 'Terv': '06:00'}
adatok = [dict(zip(rekord, i.strip('\n').split('\t'))) for i in f1 if i != '\n']

# teljes fájl beolvasva az "adatok" nevű listába
# példa az első elemre (adatok[0]):
# {'Megjegyzes': 'Felszállt', 'Repter': 'London Luton', 'Kod': 'W62201', ...
# 'Terminal': '1', 'Indulas': '05:59', 'Terv': '06:00'}

# az időkülönbségek számításához kell ez a könyvtár
from datetime import datetime as ido

# végignézzük az összes bejegyzést
for adat in adatok:
terv = ido.strptime(adat['Terv'], '%H:%M') # a "terv" egy időobjektum lesz a szövegből a megadott formátummal
teny = ido.strptime(adat['Indulas'], '%H:%M') # a "teny" egy időobjektum lesz a szövegből a megadott formátummal
kulonb = teny - terv # a két időpont különbsége (egy datetime.timedelta objektum)
adat['Diff'] = kulonb.total_seconds() / 60 # a differenciát hozzáírjuk (mp -> perc)

#megnyitunk egy másik fájl adatmentésre
with open('d:\\kimenet.txt', 'w') as f2:

# kiírjuk bele azokat az elemeket (a megadott adatokkal, tabulátorral elválasztva), amiknél az időkülönbség pozitív
[f2.write('\t'.join([elem['Kod'], elem['Repter'], str(elem['Diff'])]) + '\n') for elem in adatok if elem['Diff'] > 0]

Vannak benne kommentek is, remélem azzal együtt érthető lesz. Ha egy sorban nincs várható időpont az a beolvasásnál nem baj, feltéve, hogy a tab-ok ki vannak neki hagyva. A számolásnál már gond lehet :), ott bele kell nyúlni a kódba valamiféle vizsgálattal.

[ Szerkesztve ]


n00n
(őstag)

Miképpen oldanátok meg ezt a feladatot?

Van n darab emberünk, egy fájlból olvassuk be a nevüket, akik köszönnek egymásnak. Írjon egy programot, ami az alábbihoz hasonló kimenetet generál:

Béla köszönt Tamás nevű ismerősének
Eszter köszönt Béla nevű ismerősének
Béla köszönt Eszter nevű ismerősének
Tamás köszönt Eszter nevű ismerősének
Eszter köszönt Tamás nevű ismerősének
Tamás köszönt Béla nevű ismerőségnek

A fájlbeolvasást nem kell megírnia. Tegyük fel, hogy az már csak kész van. Viszont úgy írja meg a programot, hogy a beolvasott adatok változhatnak (egyszer csak két ember, egyszer 10). Mindenki köszönjön mindenkinek, viszont véletlenszerűen.

Adjatok kérlek tanácsot merre álljak neki. :R


cousin333
(addikt)
Blog

Feltételezem, hogy mondjuk az emberek nevű listában már minden beolvasott név szerepel. Ekkor le kell generálni az összes lehetséges permutációt, hiszen "Eszter köszönti Bélát", de kell egy "Béla köszönti Esztert" is. Ez alapból szépen sorba lesz rendezve, tehát meg kell keverni őket. A kód:

import itertools
import random

variaciok = list(itertools.permutations(emberek, 2))
random.shuffle(variaciok)

A random.shuffle helyben keverget, tehát a bemenet és a kimenet egyaránt a variaciok nevű változó. Innen már csak le kell generálni a mondatokat, ami elég egyszerűen megy:

mondatok = [i[0]+' köszönt '+i[1]+' nevű ismerősének.' for i in variaciok]

Ezután ezt ki kell íratni a konzolra, fájlba... stb. Szerintem kb. ennyi. Ez működik 2, vagy akár 100 embernél is.

[ Szerkesztve ]


n00n
(őstag)

Köszi szépen. Nagyon egyszerű megoldás. :)

Viszont ennek a továbbgondolt feladatánál már elakadok.

Szöveg: Van négy (a példa miatt négy, lehet több is, tehát célszerű n db-ra megírni) darab focicsapat, hozzon létre egy tömböt/listát a lehetséges összes meccsről véletlen sorrendben, mely tartalmazza a visszavágókat is.

Eddig úgy meg vagyok. :)

A példaként vett 4 csapat tehát összesen 12 meccset játszik 6 forduló alatt, fordulónként kettőt. Generáljon egy új listát az elkészült összes meccs listából, mely a fordulókban lejátszott meccseket tartalmazza, fordulónként ; (pontosvesszővel) elválasztva egymástól. Értelemszerűen egy fordulóban egy csapat csak egyszer játszhat. A megértést segítve itt egy példa listarészlet:

fordulok = ([1,3], [4:2], ; , [3,2], [4:1], ; , [1,2], [3,4], ; , ... stb.)

Fogalmam nincs merre induljak. Ötlet?


Jester01
(veterán)
Blog

A megoldás menetét itt leírtam, a többi a pythonosok dolga ;)


n00n
(őstag)

De n db csapatra kell megírni, nem pedig csak négyre sajnos. :O

Próbáltam írni rá egy módszert, de nem akar összejönni. :(
Az all_match-ben már benne vannak a meccsek. A teams-ben pedig a csapatok

meccs_per_fordulo = len(teams)/2

fordulok = []
while len(all_match) != 0:
fordulo = []
torlendo = []
for meccsek in all_match:
if meccsek[0] not in fordulo and meccsek[1] not in fordulo:
fordulo.insert(0, ";")
fordulo.insert(0, meccsek[1])
fordulo.insert(0, meccsek[0])
torlendo.insert(0, meccsek)

if len(fordulo) == meccs_per_fordulo * 3:
fordulok.append(fordulo)
#Törlés ciklus:
for delmatch in torlendo:
all_match.remove(delmatch)

[ Szerkesztve ]


Jester01
(veterán)
Blog

Szerintem n-re is működik.
Nagyjából jónak tűnik, mi a baja?

Ja! Miután kész egy forduló a meccseket megint elölről kellene kezdeni, vagyis akkor ki kellene lépni a for ciklusból

[ Szerkesztve ]


n00n
(őstag)

Kiegészítettem egy break-kel (illetve egy print-el, hogy lássam még mennyi csapat van vissza). Négy csapat esetén gyönyörűen elboldogul, többnél már viszont kiakad. Ötlet?

meccs_per_fordulo = len(teams)/2

fordulok = []
while len(all_match) != 0:
fordulo = []
torlendo = []
for meccsek in all_match:
if meccsek[0] not in fordulo and meccsek[1] not in fordulo:
fordulo.insert(0, ";")
fordulo.insert(0, meccsek[1])
fordulo.insert(0, meccsek[0])
torlendo.insert(0, meccsek)

if len(fordulo) == meccs_per_fordulo * 3:
fordulok.append(fordulo)
#Törlés ciklus:
for delmatch in torlendo:
all_match.remove(delmatch)
print("\n" + str(all_match))
break

[ Szerkesztve ]


Jester01
(veterán)
Blog

Hogy akad ki?


n00n
(őstag)

Pl. 6 csapat esetén ugye 10 forduló kéne, ebből 3-6 fordulót megold, utána csak dolgozik és csak dolgozik, de nem jut semmire.

[ Szerkesztve ]


n00n
(őstag)

Nem jó így a ciklus. Most, hogy kiíratom a még az all_match-ben maradt meccseket, már látom, hogy azért áll meg, mert nem tud olyan annyi olyan párosítást választani a fordulóhoz, hogy különböző csapatok legyenek. :(

Pedig annyira nem lehet bonyolult, ez az oldal:
http://www.fixturelist.com/createalist1.php

Egy-két szóból legenerálja a listát. Kár, hogy nem lehet megnézni a forrását. .. :U

[ Szerkesztve ]


Yoru
(csendes tag)

Hali!
Nemrég kezdtem a Python tanulását és lenne egy kérdésem.
A str() string mire használható?

pl.:

pi = 3.14159
print str(pi)

Miért nem írhatom le csak így? :F

pl:

pi = 3.14159
print pi


Siriusb
(veterán)

Szia!

Pl. azért hasznos, mert átkonvertálja az adott objektumot string-é, így az ehhez a típushoz kapcsolódó függvényeket is használni tudod.


Yoru
(csendes tag)

Tehát két lehetőség van arra h. valamit string-é alakítsak?
Mert úgy tudom, hogy ha idézőjelet teszek a szöveg elejére és végére, akkor a szöveg string lesz.


Siriusb
(veterán)

Kevered az értékadást és a konvertálást:

változó_neve = "sallala" # ha idézőjelek közé rakod, értéket adsz

var2 = "változó_neve" # itt szintén értéket adtál, és nem sallala lesz a var2


sonar
(addikt)
Blog

Hi,

Most izlelgetem ezt a nyelvet. De egy picit elakadtam. A feladat az lenne, hogy a megtalal() fv ha megtalálja a karakter-t akkor a visszatérő érték a pozició lesz. Ha meg nem találja meg a keresett karaktert akkor -1 -gyel kellene visszatérnie (de semmi esetre sem lehet 0 vagy pozitív érték)

def megtalal(szoveg,karakter):
i=0
x=len(szoveg)
while (x>=i):
if (szoveg[i]==karakter):
return i
i=i+1
return -1
print megtalal('Julietta & Romeo','x')


cucka
(addikt)
Blog

A hiba a while ciklusban van, ami egyel tovább fut, mint a stringed hossza.
Egyébként ha már pythonban programozol, akkor nem érdemes pythonra lefordított turbo pascal kódot írni.
Például pythonban könnyű végigiterálni bármin anélkül, hogy ciklusváltozóval b*szakodnál:

def megtalal(szoveg, karakter):
ret = -1
for i,c in enumerate(szoveg):
if c == karakter:
ret = i
break
return ret

(Az enumerate azért kell, hogy a string karakterei mellett azok indexét is megkapjuk, lásd a doksiban, hogy mit csinál pontosan. Ha erre nincs szükség, akkor elhagyható.)

Azt rád bízom, hogy gondold végig, vajon fog-e ez menni unicode stringekkel (nem), hogy hogyan oldod meg a hibakezelést, stb. :)

[ Szerkesztve ]


D4nte
(csendes tag)

Ha már pythonban programozik, akkor return szoveg.find(karakter). :DDD

[ Szerkesztve ]


sonar
(addikt)
Blog

for az a következő fejezet :)
úgyhogy while-lal kell megoldani
Közben rájöttem, hogy ha teszek még egy if x>i: return ret -et akkor minden müxik úgy ahogy kell


balees
(tag)
Blog

Hello,
kérlek segítsetek, elakadtam:
olyan reguláris kifejezést kellene irnom ami egy bizonyos (getParameters) függvényhívás paramétereit elkapja.
A paraméterek több sorban is lehetnek.
Ilyen lenne a függvényhívás:
getParameters(['ABCD_1',ABCD_2',
ABCD_3','ABCD_4'])

Amit eddig sikerült az elkap mindenféle paramétert (mármint ami ' ' között van:

import re

str = "getParameters(['ABCD_1','ABCD_2',\
'ABCD_3','ABCD_4'])\
getPara(['AAA','BBB'])"

parameters = re.findall(r'\'[\w-]+\'', str)
for parameter in parameters:
print parameter

Amit nem tudok elérni hogy csak a getParameters-ből származó értékek kellenek.

[ Szerkesztve ]

üzenetek