Clojure: boshqa vektorda vektor elementini qanday olish mumkin

Men Clojure uchun juda yangi va vektorlarning/ro'yxatlar/xaritalar operatsiyalarini tushunishda qiyinchiliklarga duch kelmoqdaman. Ma'lumotlardagi barcha mijozlarning nomlarini chop etmoqchiman, ammo qanday qilib men tushunmayman. Iltimos yordam bering.

(def data
"1|John Smith|123 Here Street|456-4567
2|Sue Jones|43 Rose Court Street|345-7867
3|Fan Yuhong|165 Happy Lane|345-4533")

(defn test
[]
  (let [lines       (str/split-lines data)
        line-vecs-1 (mapv #(str/split % #"\|" ) lines)]
       (for [x line-vector-c] (print (line-vector-c 1))
       )
  )
)

menga beradi:

 [2 Sue Jones 43 Rose Court Street 345-7867][2 Sue Jones 43 Rose Court Street 
 345-7867][2 Sue Jones 43 Rose Court Street 345-7867]

nima istayman:

"John Smith"
"Sue Jones"
"Fang Yuhong"
0
line-vector-c aniqlanmagan. Bundan tashqari, for uchun dangasa va bosma kabi yon ta'sirlar uchun tavsiya etilmaydi. Uning o'rniga doseq dan foydalaning.
qo'shib qo'ydi muallif exupero, manba
line-vector-c aniqlanmagan. Bundan tashqari, for uchun dangasa va bosma kabi yon ta'sirlar uchun tavsiya etilmaydi. Uning o'rniga doseq dan foydalaning.
qo'shib qo'ydi muallif exupero, manba
Boshqa barcha shunga o'xshash savollarni ko'rib chiqdingizmi? Ko'pchilik xuddi shu sinfda yoki bir xil uy vazifasi bilan shug'ullangan ko'rinadi. Clojure yorlig'ini bosing va savollarga qaraylik, chunki bu asosan bir necha bor javob berilgan.
qo'shib qo'ydi muallif Carcigenicate, manba
Umuman olganda, ma'lumotlarning Clojure ma'lumotlar strukturasida yashayotgani, bu holda bir vektor yoki xaritalarning ketma-ketligi deb hisoblash yaxshidir. Muammo keyinchalik ikkiga bo'linadi: 1. ma'lumotni bunday shaklga tushirish va 2. javobni olish va chiqarib tashlash.
qo'shib qo'ydi muallif Thumbnail, manba
Umuman olganda, ma'lumotlarning Clojure ma'lumotlar strukturasida yashayotgani, bu holda bir vektor yoki xaritalarning ketma-ketligi deb hisoblash yaxshidir. Muammo keyinchalik ikkiga bo'linadi: 1. ma'lumotni bunday shaklga tushirish va 2. javobni olish va chiqarib tashlash.
qo'shib qo'ydi muallif Thumbnail, manba

8 javoblar

Hozirgacha bor bo'lgan narsalar (biroz qayta yozilgan):

(mapv (fn [l]
        (str/split l #"\|"))
      (str/split-lines data))

(str/split-lines data) splits the lines into a sequence of strings:

["1|John Smith|123 Here Street|456-4567"
 "2|Sue Jones|43 Rose Court Street|345-7867"
 "3|Fan Yuhong|165 Happy Lane|345-4533"]

(mapv #(str/split % #"\|") lines) splits each line into tuples of strings:

[["1" "John Smith" "123 Here Street" "456-4567"] 
 ["2" "Sue Jones" "43 Rose Court Street" "345-7867"]
 ["3" "Fan Yuhong" "165 Happy Lane" "345-4533"]]

Keling, har bir satrlarni naychaning ikkita elementiga aylantirmoqchisiz. Buning uchun foydalanishingiz mumkin bo'lgan bir nechta funksiya mavjud: get yoki nth (har ikkisi ham nolga asoslangan).

Misol uchun:

(mapv (fn [l]
        (get (str/split l #"\|")
             1))
      (str/split-lines data))
3
qo'shib qo'ydi

Hozirgacha bor bo'lgan narsalar (biroz qayta yozilgan):

(mapv (fn [l]
        (str/split l #"\|"))
      (str/split-lines data))

(str/split-lines data) splits the lines into a sequence of strings:

["1|John Smith|123 Here Street|456-4567"
 "2|Sue Jones|43 Rose Court Street|345-7867"
 "3|Fan Yuhong|165 Happy Lane|345-4533"]

(mapv #(str/split % #"\|") lines) splits each line into tuples of strings:

[["1" "John Smith" "123 Here Street" "456-4567"] 
 ["2" "Sue Jones" "43 Rose Court Street" "345-7867"]
 ["3" "Fan Yuhong" "165 Happy Lane" "345-4533"]]

Keling, har bir satrlarni naychaning ikkita elementiga aylantirmoqchisiz. Buning uchun foydalanishingiz mumkin bo'lgan bir nechta funksiya mavjud: get yoki nth (har ikkisi ham nolga asoslangan).

Misol uchun:

(mapv (fn [l]
        (get (str/split l #"\|")
             1))
      (str/split-lines data))
3
qo'shib qo'ydi

Foydalanadigan ismlar ro'yxatini olishingiz mumkin

(def names
  (sequence
    (comp
      (map #(str/split % #"\|"))
      (map second))
    (str/split-lines data)))

Keyin har bir nomni yozing

(doseq [n names]
  (println n))

Men tez-tez tartibini dan foydalanaman va ma'lumotlarni o'rganish uchun transduserlarni yaratdim, chunki u bir vaqtning o'zida konvertatsiya qilish uchun qulaydir.

1
qo'shib qo'ydi

Foydalanadigan ismlar ro'yxatini olishingiz mumkin

(def names
  (sequence
    (comp
      (map #(str/split % #"\|"))
      (map second))
    (str/split-lines data)))

Keyin har bir nomni yozing

(doseq [n names]
  (println n))

Men tez-tez tartibini dan foydalanaman va ma'lumotlarni o'rganish uchun transduserlarni yaratdim, chunki u bir vaqtning o'zida konvertatsiya qilish uchun qulaydir.

1
qo'shib qo'ydi

RegEx foydalanish:

(xarita second (Qayta-qayta #"\|(.*?)\|" data))

qaytaradi:

("John Smith" "Sue Jones" "Fan Yuhong")

Izoh:

Qayta-qayta

We ask Qayta-qayta to find at each line the first content between a pair of |. The ? in the regex means we want a non greedy search.

(Qayta-qayta #"\|(.*?)\|" data)

qaytaradi:

(["|John Smith|" "John Smith"] ["|Sue Jones|" "Sue Jones"] ["|Fan Yuhong|" "Fan Yuhong"])

xarita

Finally, we use xarita second to visit each element of the list and get only the second string of the vector.

0
qo'shib qo'ydi

RegEx foydalanish:

(xarita second (Qayta-qayta #"\|(.*?)\|" data))

qaytaradi:

("John Smith" "Sue Jones" "Fan Yuhong")

Izoh:

Qayta-qayta

We ask Qayta-qayta to find at each line the first content between a pair of |. The ? in the regex means we want a non greedy search.

(Qayta-qayta #"\|(.*?)\|" data)

qaytaradi:

(["|John Smith|" "John Smith"] ["|Sue Jones|" "Sue Jones"] ["|Fan Yuhong|" "Fan Yuhong"])

xarita

Finally, we use xarita second to visit each element of the list and get only the second string of the vector.

0
qo'shib qo'ydi

Har bir satrni ajratib, ikkinchi ustunni shunday qilib olishingiz mumkin

(defn test [xs]
    (->> (str/split-lines xs)       ;split lines
         (map #(str/split % #"\|")) ;get columns
         (map second)))             ;only the second element of each line

va natija chop eting

(map println (test data))

yoki faqat doseq dan foydalaning

(doseq [n (test data)]
  (println n))
0
qo'shib qo'ydi

Har bir satrni ajratib, ikkinchi ustunni shunday qilib olishingiz mumkin

(defn test [xs]
    (->> (str/split-lines xs)       ;split lines
         (map #(str/split % #"\|")) ;get columns
         (map second)))             ;only the second element of each line

va natija chop eting

(map println (test data))

yoki faqat doseq dan foydalaning

(doseq [n (test data)]
  (println n))
0
qo'shib qo'ydi