Ersetzen Sie ein Element X in einer Liste durch 0,5 * X.
Ich habe eine Liste mit 33600 Elementen und muss jedes Element, das größer als 6000 ist, durch seine Hälfte ersetzen. Ich "übte" mit einer kleineren Liste und versuchte Folgendes:
List1 = {1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000};
ListNew = {};
Do[
{
Numb = Take[List1, n ;; n],
NumbNew = 0.5 Numb,
ConditionalExpression[Numb > 9000,
ListNew = Append[ListNew, NumbNew]],
ListNew = Append[ListNew, Numb]
}
,
{n, 1, Length[List1]}]
Ich möchte, dass ListNew so aussieht:
{1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 5000}
Aber was ich bekomme ist folgendes:
{5000, 1000, 5000, 2000, 5000, 3000, 5000, 4000, 5000, 5000,
5000, 6000, 5000, 7000, 5000, 8000, 5000, 9000, 5000, 10000 }}
Ich habe auch versucht, es zu benutzen If, aber es hat auch nicht funktioniert
Gibt es eine Möglichkeit, dies zu beheben?
Antworten
(# + # UnitStep[6000 - #])/2 & @ List1
{1000, 2000, 3000, 4000, 5000, 6000, 3500, 4000, 4500, 5000}
Eine Methode, die der des OP nahe kommt:
ListNew = Table[
If[TrueQ[n > 6000], 0.5 * n, n],
{n, List1}
]
Versuche dies:
lst1 = {1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000};
lst1 /. x_ /; x > 6000 -> x/2
(* {1000, 2000, 3000, 4000, 5000, 6000, 3500, 4000, 4500, 5000} *)
Habe Spaß!
Ein anderer Weg:
listnew = List1 (Boole[Thread[List1 <= 6000]] + 1/2 Boole[Thread[List1 > 6000]] )
{1000, 2000, 3000, 4000, 5000, 6000, 3500, 4000, 4500, 5000}
Der erste Boole ist 1, wenn die Listennummern kleiner als 6000 sind, und der zweite Boole ist 1/2 ... dies wird dann mit den Werten von List1 multipliziert.
Die eingebauten Funktionen Piecewiseund Mapsind gut für solche Dinge. Definieren Sie einfach eine stückweise Funktion, die Ihre Bedingung implementiert, und ordnen Sie sie Ihrer Liste zu, um eine neue zu erhalten. Wie so:
With[{max = 9000}, f[x_] := Piecewise[{{x, x ≤ max}, {x/2, x > max}}]]
new = f /@ {1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000}
{1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 5000}
Diese präzisere Form funktioniert ebenfalls, ist jedoch etwas weniger lesbar:
With[{max = 9000}, f[x_] := Piecewise[{{x, x ≤ max}}, x/2]]
lst//#.DiagonalMatrix[Clip[UnitStep[#-6000],{1,0},{1,1/2}]]&
{1000, 2000, 3000, 4000, 5000, 3000, 3500, 4000, 4500, 5000}